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


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

 

 

 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/

 


免責聲明!

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



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