检查点位于飞机的哪一侧

25

我希望将一个由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);

我对这两个向量执行叉积操作,以获得法向量。

然后,我循环遍历我的点数组,将它们转换为向量并计算其与法向量的点积。

接着,我使用点积来确定点所在的位置。

这听起来行得通吗?


1
听起来这个方法应该是可行的。然而,我也要指出,你可以通过将点plane.a乘以法向量来消除内部循环中的“向量化”,从而得到一个恒定的偏移量。这样可以消除2次减法,并且本质上与@Ali的解决方案相同:他的d-dot(plane_normal, plane.a) - comingstorm
1
我需要在高度迷幻的状态下重新学习这个知识点,而且顶部的谷歌搜索结果很难理解,所以我想提供一个简化的答案:(a,b,c)是平面的法向量,(x,y,z)是点,没有“d”,它是虚假的,不会对你造成伤害,将两者移动,使得平面位于(0,0,0),不需要对任何东西进行归一化...基本上就是abovePlane = a*x + b*y + c*z > 0.0; - Anne Quinn
4个回答

39

a*x+b*y+c*z+d=0为确定你的平面的方程。

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

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

老实说,我没有审查您所写内容的细节。我猜想您同意我的提议更简单易懂。


8
把它写成 dot( (a,b,c,d), (x,y,z,1) ) > 0 的形式,其中正的点积在平面前面,负的在后面可能更有用/更快。 - Lucas Walter
11
这是点乘形式:如果你展开 dot((a,b,c,d),(x,y,z,1)),你会得到恰好是 a*x+b*y+c*z+d。 :) - Ali
2
你能用线性代数的语言解释一下这个方法吗?当点积为正或负时,它是什么意思? - Dagang
3
@dagang 飞机将空间分成两个半空间。平面的法向量指向这些半空间中的一个,我们称之为 H。如果点在 H 中,则点积为正;否则为负。如果恰好在平面上,则为零。 - Ali
2
@Saladsamurai,确实如此,但请记住,高阶事物更加复杂。例如,您如何定义具有两个表面双曲面的“同侧”?随着高阶事物的出现,事情变得更加复杂,因此需要极大的谨慎。很抱歉,我无法提供更具体的信息。 :-( - Ali
显示剩余2条评论

3
以下是之前提到的“将点放入平面方程并检查符号”的方法。可以使用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"

我没有将它的速度与上述方法进行比较测试,但它绝对是最简单的方法。

1
你的方法听起来不错。然而,当你说“把它们转化为向量”时,可能不太好(取决于你句子的含义)。
你应该通过计算当前点和平面上某个点之间的坐标差异(例如,定义平面的三个点之一)来“将你的点转换为向量”。就像你写的那样,听起来你可能误解了这一点;但除此之外,没问题!

0

考虑平面的法线向量

例子:对于点A=[-243.815437431962, -41.7407630281635, 10.0] 方程= -2663.1860000000006*Z +21305.488000000005=0 结果为正

但如果方程= 2663.1860000000006*Z -21305.488000000005=0

结果为负


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接