Как получить расстояние от точки до плоскости в 3d? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть треугольник с точками A, B, C и точкой в ​​пространстве (P).Как я могу получить расстояние от точки до плоскости?Мне нужно вычислить расстояние от P до плоскости, даже когда мой треугольник лежит далеко (или не выше точки, как на картинке).

Точка и треугольник:

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

Если точка P(x1,y1,z1) и плоскость ax+by+cz+d = 0

Расстояние

 dist = Abs(a*x1+b*y1+c*z1+d) / Sqrt(a^2+b^2+c^2)
1 голос
/ 16 марта 2019

Я предполагаю, что вы хотите вычислить перпендикулярное расстояние между точкой и плоскостью, учитывая 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 или в противоположной точке, иногда такая информация требуется, поэтому в такой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
1 голос
/ 15 марта 2019

Преобразовал его в код:

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);

Это работает! Спасибо!

...