如何在3d中获得点到平面的距离?

时间:2019-03-15 19:11:41

标签: 3d geometry point projection plane

我有一个三角形,其中的点A,B,C和空间点(P)。如何获得点到平面的距离?我需要计算从P到平面的距离,即使我的三角形距离很远(或不高于该点,如图所示)。

点和三角形:

4 个答案:

答案 0 :(得分:3)

如果点是P(x1,y1,z1)而平面是ax+by+cz+d = 0

Distance

 dist = Abs(a*x1+b*y1+c*z1+d) / Sqrt(a^2+b^2+c^2)

答案 1 :(得分:1)

将其转换为代码:

var a = pos1.y * (pos2.z - pos3.z) + pos2.y * (pos3.z - pos1.z) + pos3.y * (pos1.z - pos2.z);
var b = pos1.z * (pos2.x - pos3.x) + pos2.z * (pos3.x - pos1.x) + pos3.z * (pos1.x - pos2.x); 
var c = pos1.x * (pos2.y - pos3.y) + pos2.x * (pos3.y - pos1.y) + pos3.x * (pos1.y - pos2.y);
var d = -(pos1.x * (pos2.y * pos3.z - pos3.y * pos2.z) + 
        pos2.x * (pos3.y * pos1.z - pos1.y * pos3.z) + 
        pos3.x * (pos1.y * pos2.z - pos2.y * pos1.z));


var dist = Math.Abs(a * point.x + b * point.y + c * point.z + d) / Math.Sqrt(a * a + b * b + c * c);

有效!谢谢!

答案 2 :(得分:1)

我假设您要计算点与平面之间的垂直距离(给定3个点,形成一个三角形)。这里是向量数学方法:

  1. 定义

    让三角形点为p0,p1,p2,测试点为p

  2. 平面法线

    首先,我们需要获取平面法线,即平面内任意两个非平行和非零向量的简单向量乘法:

    n = cross( p1-p0 , p2-p0 )
    

    并将其归一化为单位矢量(以简化内容):

    n = n/|n|
    
  3. 垂直距离

    为此,我们可以利用点积,因此只需创建一个从平面上任何点到您的测试点的向量,并使用单位法线...

    dist = |dot ( p-p0 , n )|
    

    perp. dist

    最后一个绝对值(按标距)将摆脱结果的符号,该符号告诉您点p是在法线n的方向上还是在相反的方向上,有时这样的信息需要,因此在这种情况下,请删除最外面的abs值,并使用多边形绕线和叉积操作数来保持所需的法线方向。

在这里(查找 [edit2] ),您会发现在需要时使用的crossdot||等式:

所以,如果我将所有代码放在一起,例如形式:

U.x=p1.x-p0.x; V.x=p2.x-p0.x; // basis vectors on the plane
U.y=p1.y-p0.y; V.y=p2.y-p0.y;
U.z=p1.z-p0.z; V.z=p2.z-p0.z;
n.x=(U.y*V.z)-(U.z*V.y);      // plane normal
n.y=(U.z*V.x)-(U.x*V.z);
n.z=(U.x*V.y)-(U.y*V.x);
dist = sqrt( (n.x*n.x) + (n.y*n.y) + (n.z*n.z) ); // normalized
n.x /= dist;
n.y /= dist;
n.z /= dist;
dist = abs( (p.x-p0.x)*n.x + (p.y-p0.y)*n.y + (p.z-p0.z)*n.z ); // your perpendicular distance

答案 3 :(得分:1)

只是一个精度,最后一个响应中有一个双符号交换。在 var d 中,没有 - 并且要访问应该计算的距离:

<块引用>

var dist = Math.Abs​​(a * point.x + b * point.y + c * point.z - d) / Math.Sqrt(a * a + b * b + c * c);

对输出没有任何改变,但如果您之后使用平面方程,这很重要