在圖形學中判斷一個點是否在多邊形內,若多邊形不是自相交的,那麼可以簡單的判斷這個點在多邊形內部還是外部;若多邊形是自相交的,那麼就需要根據非零纏繞規則和奇-偶規則判斷。
判斷多邊形是否是自相交的:多邊形在平面內除頂點外還有其他公共點
內-外測試
不自交的多邊形:多邊形僅在頂點處連接,而在平面內沒有其他公共點,此時可以直接劃分內-外部分。
自相交的多邊形:多邊形在平面內除頂點外還有其他公共點,此時劃分內-外部分需要採用以下的方法。
(1)奇-偶規則(Odd-even Rule):奇數表示在多邊形內,偶數表示在多邊形外
從任意位置p作一條射線,若與該射線相交的多邊形邊的數目爲奇數,則p是多邊形內部點,否則是外部點。
(2)非零纏繞規則(Nonzero Winding Number Rule):若環繞數爲0表示在多邊形內,非零表示在多邊形外
首先使多邊形的邊變爲矢量。將環繞數初始化爲零。再從任意位置p作一條射線。當從p點沿射線方向移動時,對在每個方向上穿過射線的邊計數,每當多邊形的邊從右到左穿過射線時,環繞數加1,從左到右時,環繞數減1。處理完多邊形的所有相關邊之後,若環繞數爲非零,則p爲內部點,否則,p是外部點。
參考[1]中例子如下,
判斷點p是否在多邊形內,從點p向外做一條射線(可以任意方向),多邊形的邊從左到右經過射線時環數減1,多邊形的邊從右往左經過射線時環數加1,最後環數不爲0,即表示在多邊形內部。
當然,非零纏繞規則和奇偶規則會判斷出現矛盾的情況,如下圖所示,左側表示用 奇偶規則判斷繞環數爲2 ,表示在多邊形外,所以沒有填充。右側圖用非零纏繞規則判斷出繞數爲2,非0表示在多邊形內部,所以填充。
另外一個例子,如下
參考
[1]http://www.cs.rit.edu/~icss571/filling/alt_parity.html
[2]http://cs.hust.edu.cn/webroot/courses/csgraphics/jiaocai.php?bookpage=5_c_c
[3]http://en.wikipedia.org/wiki/Nonzero-rule