參考:
如下左圖,適用於所有多邊形,增加乙個通過測量點的橫線(或任意直線),此直線與多邊形邊緣的交點,當測量點左右的交點都為奇數時,點在多邊形以內。反之則不在。
但是如果測量點處於多邊形邊緣或頂點或下右3圖的情況下時,結果將不準確,不過我們可以根據不同的情況作特殊處理來保證結果的正確性。
關於這個演算法的具體的更多圖形例子:
1 首先將多邊形的座標存在在乙個陣列裡,首先我們需要取得該陣列在橫座標和縱座標的最大值和最小值,根據這四個值minx,maxx,miny,maxy,算出乙個四邊形,判斷目標點是否在這個四邊形內,不滿足,直接返回false,證明該目標點不在此多邊形內部。
if(m_pos.x
< minx || m_pos.x > maxx || m_pos.y
< miny || m_pos.y > maxy)
2 然後在多邊形所規定的平面上,隨便定義乙個點,之後通過該點水平畫一條線,數數這條橫線和多邊形的邊相交多少次,看這條橫線穿越多邊形的次數是否為奇數,若為奇數,那麼該目標點在多邊形內,若為偶數,則在多邊形外。
// vert 代表多邊形有幾個點,testx, testy 代表待測目標點的座標,*vertx, *verty分別指向儲存多邊形橫縱座標陣列的首位址
// 每次計算都涉及到相鄰的兩個點和待測試點,然後考慮兩個問題:
// 1) 被測試點的縱座標是否在本次迴圈所測試的兩個相鄰點縱座標範圍之內?
// verty[i] < testy < vert[j] 或者 vert[j] < testy < vert[i]
// 2) 待測點是否在i,j兩點之間的連線之下?
// 斜率公式,幾何和不等式
// 然後每次這兩個條件同時滿足的時候我們把返回的布林量取反。
int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
return c;
}
判斷乙個點是否在多邊形內部
判斷乙個點是否在多邊形內部 三角形的有向面積 我們先判斷乙個點是否在乙個三角形內部。乙個三角形在乙個座標系 譬如由a b c三點組成 中,我們可以通過計算它的有向面積來判斷a b c三點在座標系中的順逆。當然,在此之前我們必須先訂立一套計算面積的規則。比如,在笛卡爾座標系中,我們利用 s a.x b...
判斷乙個點是否在矩形內部(Python類定義)
有乙個point,其座標為 xp,yp 有乙個四邊形 適用矩形或凸四邊形 凹四邊形不怎麼適用我的要求,沒測試 其四個角點的座標依次為 xa,ya,xb,yb,xc,yc,xd,yd 注意此處的 依次 可逆時針,也可順時針,一定要保證是依次 否則,增加排序函式。定義乙個類 ispointinquadr...
判斷任意一點是否在多邊形範圍內
射線法。該法中常用水平掃瞄線法或垂直線法來判斷一點是否在區域內。假若有一疑問點p x,y 要判斯它是否在多邊形內,可從該疑問點向左引水平掃瞄線 即射線 計算此線段與區域邊界的相交次數c。如果c為奇數,認為疑問點在多邊形內 為偶數,則疑問點在多邊形外。射線法判斷 param pointx 要判斷的點的...