點到線段的距離計算方法


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

                                         算法原理圖

 

 

在二維/三維圖形學系統當中,線段的拾取是一個經常使用的功能

如何根據鼠標點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的

無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇

但是不要忘記點到直線公式計算的是點和直線之間的關系,而不是點和線段之間的關系

需要額外的判斷,點在線段上的投影點是否位於線段內部,是才可以采用點到直線的公式,否則就不能

算法如下 
   
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秒鍾可以檢測出上百萬個線段

這個是檢測一個點和一個線段之間的最短距離的

對於一個系統當中存在大量的線段需要檢測的時候,應該把線段按照區域划分成組,建立一個包圍盒

先檢測點是否在包圍盒內部,然后再進入組內檢測具體的線段


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM