Найти расстояние от 3d-точки до отрезка линии - PullRequest
10 голосов
/ 01 февраля 2011

У меня есть 3D-точка P и отрезок линии, определяемые A и B (A - это начальная точка отрезка, B - конец).

Я хочу рассчитать кратчайшее расстояние между P илиния AB.

Вычислить расстояние от точки до бесконечной линии было легко, поскольку их решение было на Wolfram Mathworld , и я это реализовал, но мне нужно сделать это длялиния конечной длины.

Мне не удалось найти надежное решение для этого в 3d после долгих осмотров.

Я реализовал алгоритмы для вычисления точечного произведения, кросс-произведения, величина и т. д. в C ++ со структурой, содержащей числа с плавающей запятой x, y и z.

Псевдокод, ссылки или код практически на любом языке для этого было бы замечательно.

Ответы [ 3 ]

7 голосов
/ 05 апреля 2016

Java-функция

/**
 * Calculates the euclidean distance from a point to a line segment.
 *
 * @param v     the point
 * @param a     start of line segment
 * @param b     end of line segment 
 * @return      distance from v to line segment [a,b]
 *
 * @author      Afonso Santos
 */
 public static
 double
 distanceToSegment( final R3 v, final R3 a, final R3 b )
 {
   final R3 ab  = b.sub( a ) ;
   final R3 av  = v.sub( a ) ;

   if (av.dot(ab) <= 0.0)           // Point is lagging behind start of the segment, so perpendicular distance is not viable.
     return av.modulus( ) ;         // Use distance to start of segment instead.

   final R3 bv  = v.sub( b ) ;

   if (bv.dot(ab) >= 0.0)           // Point is advanced past the end of the segment, so perpendicular distance is not viable.
     return bv.modulus( ) ;         // Use distance to end of the segment instead.

   return (ab.cross( av )).modulus() / ab.modulus() ;       // Perpendicular distance of point to segment.
}

Суть всего (автономного) пакета трехмерной алгебры R3: https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb

часть библиотеки с открытым исходным кодом https://sourceforge.net/projects/geokarambola/

5 голосов
/ 01 февраля 2011

Это довольно просто. Сначала обработайте отрезок вашей линии, как если бы он был бесконечным, и найдите точку R на линии, где перпендикулярный луч от линии R проходит через вашу точку P. Если R находится между A и B на линии, то самое короткое расстояние это пиар. В противном случае самое короткое расстояние - арендодатель PA и PB.

1 голос
/ 27 сентября 2016

Я знаю, что этот вопрос немного стар, но чтобы помочь другим:

Здесь у вас есть ссылка на псевдокод (см. Расстояние от точки до луча илиСегмент ):

Псевдокод и реализация на C ++

Ссылки на реализации на нескольких языках (см. Предоставленные реализации ):

C, VBA, Java и другие реализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...