原文出處: http://www.html-js.com/article/1517
前言:本文源於前幾天看到的一條微博 http://weibo.com/1057676857/Adpfwwfsv
對於 po 主的言論我並不贊同。我是學化學的,沒有學過電腦專業的課程,但憑直覺我認為這應該也是電腦圖形學裡面比較常見的一類問題。並且我認為這並不需要多麼高端的電腦專業知識,只要中學數學沒有全還給老師,就應該能給出至少一種解法。下面就試著解一下這個題吧。
比如說,我就隨便塗了一個多邊形和一個點,現在我要給出一種通用的方法來判斷這個點是不是在多邊形內部(別告訴我用肉眼觀察……)。
首先想到的一個解法是從這個點做一條射線,計算它跟多邊形邊界的交點個數,如果交點個數為奇數,那麼點在多邊形內部,否則點在多邊形外。
這個結論很簡單,那它是怎麼來的。下面就簡單講解一下。
首先,對於平面內任意閉合曲線,我們都可以直觀地認為,曲線把平面分割成了內、外兩部分,其中“內”就是我們所謂的多邊形地區。
基於這一認識,對於平面內任意一條直線,我們可以得出下面這些結論: 直線穿越多邊形邊界時,有且只有兩種情況:進入多邊形或穿出多邊形。 在不考慮非歐空間的情況下,直線不可能從內部再次進入多邊形,或從外部再次穿出多邊形,即連續兩次穿越邊界的情況必然成對。 直線可以無限延伸,而閉合曲線包圍的地區是有限的,因此最後一次穿越多邊形邊界,一定是穿出多邊形,到達外部。
現在回到我們最初的題目。假如我們從一個給定的點做射線,還可以得出下面兩條結論: 如果點在多邊形內部,射線第一次穿越邊界一定是穿出多邊形。 如果點在多邊形外部,射線第一次穿越邊界一定是進入多邊形。
把上面這些結論綜合起來,我們可以歸納出: 當射線穿越多邊形邊界的次數為偶數時,所有第偶數次(包括最後一次)穿越都是穿出,因此所有第奇數次(包括第一次)穿越為穿入,由此可推斷點在多邊形外部。 當射線穿越多邊形邊界的次數為奇數時,所有第奇數次(包括第一次和最後一次)穿越都是穿出,由此可推斷點在多邊形內部。
到這裡,我們已經瞭解了這個解法的思路,大家可以試著自己寫一個實現出來。關於演算法實現中某些具體問題和邊界條件的處理,下次接著寫,這次畫圖已經畫夠了……
後記:給出這個解法後,我簡單搜了一下,原來這種演算法就叫做射線法(ray casting)或者奇偶規則法(even odd rule),是一種早已被廣泛應用的演算法。後面還打算介紹另一種通過迴轉數(winding number,拓撲學的一個概念)解這個問題的思路。
– P.S. –
本系列共三篇: 射線法思路 射線法實現 迴轉數法
– 完 –
本站專欄文章皆為原創,轉載請註明出處(帶有 前端亂燉 字樣)和本文的顯式連結(http://www.html-js.com/article/1517),本站和作者保留隨時要求刪除文章的權利。