如何計算點到線段的最近距離

算法原理圖
在二維/三維圖形學系統當中,線段的拾取是一個經常使用的功能
如何根據鼠標點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的
無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇
但是不要忘記點到直線公式計算的是點和直線之間的關系,而不是點和線段之間的關系
需要額外的判斷,點在線段上的投影點是否位於線段內部,是才可以采用點到直線的公式,否則就不能
算法如下
class Point
float Distance(Point p1, Point p2); // 返回兩點之間的距離
float DistanceLine(Point a, Point b, Point c) // a和b是線段的兩個端點, c是檢測點
{
Point ab = b - a;
Point ac = c-a;
float f = ab * ac;
if (f<0) return Distance(c, a);//C1處的點
float d = ab * ab;
if ( f>d) return Distance(c, b);//C2處的點,d=f*cos(theta)
f = f/d;
Point D = a + f *ab; // c在ab線段上的投影點
return Distance(c, D);
}
這個算法計算量很少,在現在流行配置的計算機基本上在當中1秒鍾可以檢測出上百萬個線段
這個是檢測一個點和一個線段之間的最短距離的
對於一個系統當中存在大量的線段需要檢測的時候,應該把線段按照區域划分成組,建立一個包圍盒
先檢測點是否在包圍盒內部,然后再進入組內檢測具體的線段
