最近工作中遇到了這個問題,檢索之後發現這種實現方式挺有意思的,無論是凸多邊形還是凹多邊形都可以判斷。
射線法是用被測點向任意方向(通常為了好算,使其射向右側)做一條射線,判斷射線與多邊形的交點。如果交點的數量為奇數,則被測點在多邊形內;如果交點的數量為偶數,則被測點在多邊形以外。
期間,有些特殊情況需要判斷,比如:
1. 射線剛好經過凸多邊形兩條相鄰邊的交點上的情況會導致重複判斷;
2.射線和多邊形的邊重合的情況。
先上js**。
functionisdotinpolygon(point, polygonpoints)
} return
flag;
}
關鍵點在於判斷射線與多邊形邊相交的部分,這段**原理不是我想出來的,它實現的方式很是精妙。
首先咱們看 表示式1: p1.y > point.y != p2.y > point.y
表面上看,表示式1是用了乙個類似於異或的判斷,要求被測點的y座標在迴圈中多邊形當前邊的y軸投影範圍內;
然後看 表示式2 : point.x < (point.y - p1.y) * (p1.x - p2.x) / (p1.y - p2.y) + p1.x
這段看起來有點複雜,其實拿動筆畫一畫就很容易明白(沒錯,我又懶得上圖了)。
判斷點是否在多邊形中 射線判斷法
1.叉乘判別法 只適用於凸多邊形 想 象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將 該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊...
python3射線法判斷點是否在多邊形內
usr bin python3.4 coding utf 8 def ispointinpolygon point,rangelist 0,0 1,1 0,1 0,0 1,0.8 判斷是否在外包矩形內,如果不在,直接返回false lnglist latlist for i in range len...
判斷點是否在多邊形內
1.叉乘判別法 只適用於凸多邊形 想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...