射線法,顧名思義,就是用射線去判斷點是否在多邊形內。射線從哪來呢?
在這裡先設要判斷的點為p(x,y),多邊形構成的點用乙個 v[maxn](x,y)陣列儲存(其中maxn是該多邊形的頂點數);
射線是從p(x,y)開始,水平向右(平行於 x 軸)引出,當然,這條射線只是虛擬的,想象出來就行了。射線引出來後有可能會穿過多邊形的邊,分兩種情況:
1.引出來的射線沒穿過多邊形的邊,那麼p(x,y)必定是在多邊形外的,若設該射線穿過多邊形的邊數為 tot,那麼 tot = 0;
2.引出來的射線穿過了多邊形的邊,那麼當穿過的邊數為奇數時,p(x,y)在多邊形內,為偶數時,就穿出多邊形了,就在多邊形外(在這裡,若射線與多邊形的某條邊重合了,是不加 tot 的,當射線穿過的點是多邊形的頂點(也就是兩條邊的交點)時,我們只加一次 tot )
這樣,用射線法判斷的大體思路就出來了,現在是怎麼判斷射線穿過了多邊形的邊,以及統計射線穿過的邊數 tot;
首先我們想,射線是向右的,列舉多邊形的每一條邊,若邊在p(x,y)的右邊,而且p點的縱座標 y 在這條邊的縱座標範圍內(也就是 p.y 大於等於這條邊縱座標最小的點的 y,小於這條邊縱座標最大的點的 y)那麼這條射線就會穿過該邊,然後 tot++就行;
判斷p點的縱座標在一條邊的縱座標範圍內很容易,這裡不多說;
接著就是怎樣判斷一條邊在乙個點的右邊。因為上一步已經判斷過p點的縱座標在這條邊的縱座標範圍內了,那麼這條邊絕對不會平行 x軸,讀者可以從上述紅色字型部分找原因。既然這條邊不是平行 x 軸,那麼必定是豎的或斜的!這樣,我們就可以用利用向量的叉積判斷了!首先設兩個向量 v1,v2;
就按照如圖的方向給v1和v2賦值。(右邊的豎線是多邊形的一條邊,p點在左邊標註的地方,圖畫的有點挫,將就一下吧...)
若 v1
好吧,我想說的就是這些了,具體還是要自己實踐,用這個去試試 zoj 的1081題吧,理解了應該能過吧!
判斷點在多邊形內演算法(射線法)
謝謝分享!點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段...
判斷點在多邊形內 射線法詳解
現有乙個點p x0,y0 多變形ptpolypon,判斷點p是否在多邊形內。判斷乙個點是否在多邊形內,我們可以從該點引出一條水平射線 任意射線都可,但水平便於計算 觀察射線與多變形的交點個數,如果交點個數為奇數,則該點在多邊形內,如果為偶數則在多邊形外。如圖 點在多邊形內,從該點做一條水平射線,與多...
點在多邊形內的判斷
凸多邊形考慮叉積,因為在凸多邊形中,我們假設圍繞多邊形走一圈,如果點在多邊形內,那麼這個點一直在我們的同一側。按照這個性質,我們順時針或者逆時針處理多邊形上的點,叉積運算,算參考的和多邊形上連續的兩個點,如何叉積的結果符號發生變化,那麼不再多邊形內。double det point p1,point...