判斷乙個點是否在多邊形內部 射線法思路

2021-07-24 05:20:14 字數 2462 閱讀 6132

判斷乙個點是否在多邊形內部 [1] 射線法思路、

判斷乙個點是否在多邊形內部 [2] 射線法實現

比如說,我就隨便塗了乙個多邊形和乙個點,現在我要給出一種通用的方法來判斷這個點是不是在多邊形內部(別告訴我用肉眼觀察……)。

首先想到的乙個解法是從這個點做一條射線,計算它跟多邊形邊界的交點個數,如果交點個數為奇數,那麼點在多邊形內部,否則點在多邊形外。

這個結論很簡單,那它是怎麼來的?下面就簡單講解一下。

首先,對於平面內任意閉合曲線,我們都可以直觀地認為,曲線把平面分割成了內、外兩部分,其中「內」就是我們所謂的多邊形區域。

基於這一認識,對於平面內任意一條直線,我們可以得出下面這些結論:

直線穿越多邊形邊界時,有且只有兩種情況:進入多邊形或穿出多邊形。

在不考慮非歐空間的情況下,直線不可能從內部再次進入多邊形,或從外部再次穿出多邊形,即連續兩次穿越邊界的情況必然成對。

直線可以無限延伸,而閉合曲線包圍的區域是有限的,因此最後一次穿越多邊形邊界,一定是穿出多邊形,到達外部。

現在回到我們最初的題目。假如我們從乙個給定的點做射線,還可以得出下面兩條結論:

如果點在多邊形內部,射線第一次穿越邊界一定是穿出多邊形。

如果點在多邊形外部,射線第一次穿越邊界一定是進入多邊形。

把上面這些結論綜合起來,我們可以歸納出:

當射線穿越多邊形邊界的次數為偶數時,所有第偶數次(包括最後一次)穿越都是穿出,因此所有第奇數次(包括第一次)穿越為穿入,由此可推斷點在多邊形外部。

當射線穿越多邊形邊界的次數為奇數時,所有第奇數次(包括第一次和最後一次)穿越都是穿出,由此可推斷點在多邊形內部。

到這裡,我們已經了解了這個解法的思路,大家可以試著自己寫乙個實現出來。

不知道大家思考得怎麼樣,有沒有遇到一些不好處理的特殊情況。今天就來講講射線法在實際應用中的一些問題和解決方案。

1點在多邊形的邊上

前面我們講到,射線法的主要思路就是計算射線穿越多邊形邊界的次數。那麼對於點在多邊形的邊上這種特殊情況,射線出發的這一次,是否應該算作穿越呢?

看了上面的圖就會發現,不管算不算穿越,都會陷入兩難的境地——同樣落在多邊形邊上的點,可能會得到相反的結果。這顯然是不正確的,因此對這種特殊情況需要特殊處理。

2點和多邊形的頂點重合

這其實是第一種情況的乙個特例。

3射線經過多邊形頂點

射線剛好經過多邊形頂點的時候,應該算一次還是兩次穿越?這種情況比前兩種複雜,也是實現中的難點,後面會講解它的解決方案。

4射線剛好經過多邊形的一條邊

這是上一種情況的特例,也就是說,射線連續經過了多邊形的兩個相鄰頂點。

解決方案:

2點和多邊形頂點重合的情況更簡單,直接比較點的座標就行了。

3頂點穿越看似棘手,其實我們換乙個角度,思路會大不相同。先來回答乙個問題,射線穿越一條線段需要什麼前提條件?沒錯,就是線段兩個端點分別在射線兩側。只要想通這一點,頂點穿越就迎刃而解了。這樣一來,我們只需要規定被射線穿越的點都算作其中一側。

如上圖,假如我們規定射線經過的點都屬於射線以上的一側,顯然點d和發生頂點穿越的點c都位於射線y的同一側,所以射線y其實並沒有穿越cd這條邊。而點c和點b則分別位於射線y的兩側,所以射線y和bc發生了穿越,由此我們可以斷定點y在多邊形內。同理,射線x分別與ad和cd都發生了穿越,因此點x在多邊形外,而射線z沒有和多邊形發生穿越,點z位於多邊形外。

解決了第三點,這一點就毫無難度了。根據上面的假設,射線連續經過的兩個頂點顯然都位於射線以上的一側,因此這種情況看作沒有發生穿越就可以了。由於第三點的解決方案實際上已經覆蓋到這種特例,因此不需要再做特別的處理。

判斷乙個點是否在多邊形內部

判斷乙個點是否在多邊形內部 三角形的有向面積 我們先判斷乙個點是否在乙個三角形內部。乙個三角形在乙個座標系 譬如由a b c三點組成 中,我們可以通過計算它的有向面積來判斷a b c三點在座標系中的順逆。當然,在此之前我們必須先訂立一套計算面積的規則。比如,在笛卡爾座標系中,我們利用 s a.x b...

判斷乙個點是否在多邊形內部 2 射線法實現

原文出處 看過上一次的思路講解後,不知道大家思考得怎麼樣,有沒有遇到一些不好處理的特殊情況。今天就來講講射線法在實際應用中的一些問題和解決方案。點在多邊形的邊上 前面我們講到,射線法的主要思路就是計算射線穿越多邊形邊界的次數。那麼對於點在多邊形的邊上這種特殊情況,射線出發的這一次,是否應該算作穿越呢...

射線法判斷乙個點是否在多邊形內

一 射線法 從需要判斷的點向任意方向引一條射線,計算與多邊形交點的個數,如果是偶數或0,則點在多邊形外,如果是奇數,則點在多邊形內,若點在多邊形的邊上,則需要做特殊判斷。二 思路 1 從需要判斷的點向x軸負方向引一條射線,判斷多邊形的每一條邊與這條射線是否有交點。需判斷的點為point p,多邊形頂...