判斷點是否在多邊形內

  • 射線法(奇偶法)

      只適用於簡單多邊形(沒有自相交點)。從P點開始的射線穿過多邊形邊界次數,多邊形的邊界將多邊形分爲內部和外部。若是是偶數在多邊形外部,不然奇數在多邊形內部。以下圖所示Pin爲內部點,Qout爲外部點,n爲經過邊界次數。測試

    另若是射線通過頂點的時候,一個標準的預約是在左邊界或下邊界的點認定多邊形內部,在右邊界或上邊界的點認爲在多邊形外部。例如兩個不一樣多邊形共享一個公共邊,那麼在這條邊上點會在一個多邊形內部而在另外一個多邊形外部。這樣能夠避免了在計算機圖形顯示中會出現的一些問題。.net

穿越規則測試規則:blog

1. 方向向上的邊包括其開始點,不包括其終止點。get

2.方向向下的邊不包括其開始點,包括其終止點。it

3.水平邊不參與穿越測試(前提是選擇水平的、向點P右邊延伸的射線)。方法

4.射線和多邊形的邊焦點必須嚴格在P點右側(規定了多邊形右邊邊界上的點在多邊形外部,在左邊邊界上的點在多邊形內部)。im

知足以上規則計算2個線段是否相交img

 

  • 轉角法

      轉角法很是簡單:按照多邊形頂點逆時針順序,從P點到頂點Vi分別作連線,其中αi爲Vi和Vi+1之間的夾角。若是α角度逆時針爲正,順時針爲負,這樣全部到頂點作連線之間夾角和爲(環繞數)0,這點P在多邊形外部,不然在內部。計算機

如上圖所示P點到各個頂點連線夾角和爲0,即P在多邊形外部。co

如上圖所示,角度之和 > 0 爲在多邊形內部。

 

環繞數推導公式 wn = 1/2π(α0 + α1 + ...... + αi) i ∈[0, n-1] 推導 wn = 1/2π(PVi*PVi+1/|PVi||PVi+1|) i ∈ [0, n-1]。該公式arccos比較耗時。

另兩種判斷方法

1. 從P點向右作射線R,若是邊從射線R下方跨到上方,那麼穿越+1,若是從上方跨到下方,則是-1。最終和爲wn環繞數。以下圖所示:

2. 這種方法沒必要去計算射線和邊的交點,但須要判斷點P是否在邊的左邊,但對於方向向上和向下的邊的判斷與是否在左邊規則不一樣。對於方向向上的邊,若是穿過設想到達P的右邊,那麼P是在邊的左側;方向向下的邊若是穿越射線的正方向,那麼P在邊的右邊(意思是說判斷點P與邊的關係,而不是相對座標系內位置)。

如上圖a 和圖b中P點都是位於射線左側,可是向上和向下方向的邊P點位於不一樣位置。

僞代碼以下:須要注意的是一樣須要準守射線法中一、二、4項規則。

相關文章
相關標籤/搜索