检查平面点的哪一侧

Gam*_*ver 20 math 3d pseudocode

我正在尝试采用一系列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);
Run Code Online (Sandbox Code Playgroud)

我取这两个向量的交叉乘积来得到法向量.

然后我循环遍历我的点阵并将它们转换为向量并根据法线计算点积.

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

这听起来像它会起作用吗?

Ali*_*Ali 25

让我们a*x+b*y+c*z+d=0确定你的飞机.

[x,y,z]点的坐标替换为等式的左侧(我的意思是a*x+b*y+c*z+d)并查看结果的符号.

具有相同符号的点位于平面的同一侧.

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

  • @LucasW它是*点形式:如果你扩展`dot((a,b,c,d),(x,y,z,1))`你得到'a*x + b*y + c*Z + D'.:) (4认同)
  • 将它设置为"点((a,b,c,d),(x,y,z,1))> 0"形式,其中正点积在平面前面而负值在后面可能有用/更快. (2认同)
  • 你能用线性代数的语言解释这个方法吗?点积是正数还是负数是什么意思? (2认同)
  • @dagang 飞机将空间分成两个半空间。平面的法向量指向这些半空间之一,我们称这半空间为“H”。如果点在“H”中,则点积为正,否则为负。如果正好在飞机上,则为零。 (2认同)
  • @Saladsamurai 有很好的案例,是的,但请记住,高阶事物要复杂得多。例如,您如何定义具有**两张**的[双曲面](https://en.wikipedia.org/wiki/Hyperboloid)的“同一侧”?高阶的东西会让事情变得复杂,因此需要非常小心。抱歉,我不能比这更具体了。:-( (2认同)