1. 程式人生 > >判斷一個點是否在一個復雜多邊形的內部

判斷一個點是否在一個復雜多邊形的內部

end [] 偶數 eric ext 斷點 出發 public stat

技術分享圖片

結論:從目標點出發引一條射線,看這條射線和多邊形所有邊的交點數目。如果有奇數個交點,則說明在內部,如果有偶數個交點,則說明在外部。利用此結論近些代碼編寫

技術分享圖片

 1   // 功能:判斷點是否在多邊形內 
 2     // 方法:求解通過該點的水平線與多邊形各邊的交點 
 3     // 結論:單邊交點為奇數,成立! 
 4 
 5     // 參數: 
 6     // POINT p 指定的某個點 
 7     // LPPOINT ptPolygon 多邊形的各個頂點坐標(首末點可以不一致) 
 8     // int nCount 多邊形定點的個數 
 9 
10     public static
bool PointInPolygon(Vector2 p, Vector2[] ptPolygon, int nCount) 11 { 12 int nCross = 0; 13 14 for (int i = 0; i < nCount; i++) 15 { 16 Vector2 p1 = ptPolygon[i];//當前節點 17 Vector2 p2 = ptPolygon[(i + 1) % nCount];//下一個節點 18 19 // 求解 y=p.y 與 p1p2 的交點
20 21 if (p1.y == p2.y) // p1p2 與 y=p0.y平行 22 continue; 23 24 if (p.y < Mathf.Min(p1.y, p2.y)) // 交點在p1p2延長線上 25 continue; 26 if (p.y >= Mathf.Max(p1.y, p2.y)) // 交點在p1p2延長線上 27 continue; 28 29 // 從P發射一條水平射線 求交點的 X 坐標 ------原理: ((p2.y-p1.y)/(p2.x-p1.x))=((y-p1.y)/(x-p1.x))
30 //直線k值相等 交點y=p.y 31 double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x; 32 33 if (x > p.x) 34 nCross++; // 只統計單邊交點 35 } 36 37 // 單邊交點為偶數,點在多邊形之外 --- 38 return (nCross % 2 == 1); 39 } 40 41 }

參考資料: http://erich.realtimerendering.com/ptinpoly/

判斷一個點是否在一個復雜多邊形的內部