我有一个三角形,点A,B,C和空间点(P)。我怎样才能获得从一个点到另一个点的距离?我需要计算从P到平面的距离,即使我的三角形位于远处(或者不高于该点,如图片所示)。
点和三角形:
将其转换为代码:
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);
有用!谢谢!
我假设您想要计算点和平面之间的垂直距离,给出3个点,形成一个三角形。这里矢量数学方法:
p0,p1,p2
和测试点p
。n = cross( p1-p0 , p2-p0 )
并将其规范化为单位向量(以简化内容):
n = n/|n|
dist = |dot ( p-p0 , n )|
最后一个绝对值(在标量距离上)将摆脱结果的符号,告诉你点p
是否在正常n
的方向或相反的一个有时这样的信息是想要的所以在这种情况下删除最外面的abs值并使用多边形缠绕和交叉产品操作数,以维持所需的法线方向。在这里(寻找[edit2])你会发现如果需要的话,使用cross
,dot
和||
方程式:
所以,如果我把所有的东西放在像形式的代码中:
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