我正在尝试取一组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);
我取这两个向量的叉积来得到法向量。
然后我循环遍历我的点阵并将它们转换为矢量并根据法线计算点积。
然后我使用点积来确定该点所在的一侧。
这听起来有效吗?
答案 0 :(得分:24)
让a*x+b*y+c*z+d=0
成为决定你的飞机的等式。
将点的[x,y,z]
坐标替换为等式的左侧(我的意思是a*x+b*y+c*z+d
)并查看结果的符号。
具有相同符号的点位于平面的同一侧。
老实说,我没有检查你所写内容的细节。我想你同意我的建议更简单。
答案 1 :(得分:1)
你的方法听起来不错。但是,当你说“并将它们变成向量”时,它可能不太好(取决于你的句子的含义)。
您应该通过计算当前点与平面中某个点之间的坐标之间的坐标差异来“将您的点转换为矢量”(例如,定义该点的3个点之一)平面)。正如你所写的那样,听起来你可能误会了;但除此之外,没关系!
答案 2 :(得分: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"
与上述其他方法相比,我尚未测试其速度,但是绝对是最简单的方法。