Я предполагаю, что вы хотите вычислить перпендикулярное расстояние между точкой и плоскостью, учитывая 3 точки на ней, образующие треугольник.Здесь вектор математического подхода:
определения
пусть точки треугольника будут p0,p1,p2
, а проверенная точка p
.
нормаль плоскости
сначала нам нужно получить нормаль плоскости, то есть простое векторное умножение любых двух непараллельных и ненулевых векторов внутри плоскости:
n = cross( p1-p0 , p2-p0 )
и нормализуем его по единичному вектору (для упрощения):
n = n/|n|
перпендикулярное расстояние
, которое мы можем использоватьдля этого нужно указать точку, поэтому просто поместите вектор, идущий из любой точки на плоскости, в проверенную точку и укажите точку с единицей нормали ...
dist = |dot ( p-p0 , n )|
последнее абсолютное значение (на скалярном расстоянии) просто избавится от знака результата, который говорит вам, находится ли точка p
в направлении нормали n
или в противоположной точке, иногда такая информация требуется, поэтому в такойcase удалите крайнее значение abs и используйте намотку полигонов и перекрестные операнды произведения order для поддержания требуемого нормального направления.
Здесь (ищите [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