22

我正在尝试获取一组 3D 点和一个平面,并根据它们在平面的哪一侧将这些点分成 2 个数组。在我开始大量调试之前,我想发布我计划做的事情,以确保我对如何做到这一点的理解能够奏效。

基本上我有 3 个点的飞机,我使用(伪代码):

var v1 = new vector(plane.b.x-plane.a.x, plane.b.y-plane.a.y, plane.b.z-plane.a.z);
var v2 = new vector(plane.c.x-plane.a.x, plane.c.y-plane.a.y, plane.c.z-plane.a.z);

我取这两个向量的叉积来得到法线向量。

然后我遍历我的点数组并将它们转换为向量并根据法线计算点积。

然后我使用点积来确定点所在的一侧。

这听起来可行吗?

4

3 回答 3

35

a*x+b*y+c*z+d=0成为确定您的飞机的方程式。

将点的坐标代[x,y,z]入方程的左侧(我的意思是a*x+b*y+c*z+d)并查看结果的符号。

具有相同符号的点在平面的同一侧。

老实说,我没有检查你写的细节。我想你同意我的建议更简单。

于 2013-03-28T20:00:36.350 回答
1

你的方法听起来不错。但是,当您说“并将它们转换为向量”时,它可能并不好(取决于您的句子的含义)。

您应该通过计算当前点与平面中的一个点(例如,定义平面的三个点之一)之间的坐标差来“将您的点转换为矢量”。在你写的时候,听起来你可能误解了;但除此之外,没关系!

于 2013-03-28T20:14:48.610 回答
1

按照前面给出的“将点放入平面方程并检查符号”的方法。使用SymPy可以轻松获得该方程。我用它在点列表中查找点的位置(保存为 numpy 数组)。

from sympy import Point3D, Plane
plane=Plane(Point3D(point1), Point3D(point2), Point3D(point3))
for point in pointList:
        if plane.equation(x=point[0], y=point[1],z=point[2]) > 0:
            print "point is on side A"
        else:
            print "point is on side B"

与上面提到的其他方法相比,我没有测试过它的速度,但绝对是最简单的方法。

于 2019-06-30T15:03:33.583 回答