我有一个三角形,其中的点A,B,C和空间点(P)。如何获得点到平面的距离?我需要计算从P到平面的距离,即使我的三角形距离很远(或不高于该点,如图所示)。
点和三角形:
答案 0 :(得分:3)
答案 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个点,形成一个三角形)。这里是向量数学方法:
定义
让三角形点为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
答案 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);
对输出没有任何改变,但如果您之后使用平面方程,这很重要