求从 3d 点到线段的距离

问题描述 投票:0回答:3

我有一个 3d 点 P 和一条由 A 和 B 定义的线段(A 是线段的起点,B 是终点)。

我想计算P到AB线的最短距离。

计算点到无限直线的距离很容易,因为它们是 Wolfram Mathworld 上的解决方案,我已经实现了它,但我需要对有限长度的线执行此操作。

经过大量环顾四周后,我还没有找到可靠的 3D 解决方案。

我已经实现了用包含浮点数 x、y 和 z 的结构在 C++ 中计算点积、叉积、幅度等的算法。

伪代码或几乎任何语言的代码都很棒。

math vector 3d language-agnostic
3个回答
14
投票

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 3D 代数包的要点:https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb

开源库的一部分https://sourceforge.net/projects/geokarambola/


6
投票

这相当简单。首先,将线段视为无限远,并在 R 处的垂直射线穿过点 P 的线上找到点 R。如果 R 位于线上的 A 和 B 之间,则最短距离是公关。否则,海岸测试距离是 PA 和 PB 的较小者。


0
投票

我知道,这个问题有点老了,但是为了帮助其他人:

这里有伪代码的链接(查看点到射线或线段的距离):

伪代码和C++实现

指向多种语言实现的链接(查看贡献的实现):

C、VBA、Java等实现

© www.soinside.com 2019 - 2024. All rights reserved.