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

2022-09-12 07:21:14 字數 665 閱讀 6604

最近工作中遇到了這個問題,檢索之後發現這種實現方式挺有意思的,無論是凸多邊形還是凹多邊形都可以判斷。

射線法是用被測點向任意方向(通常為了好算,使其射向右側)做一條射線,判斷射線與多邊形的交點。如果交點的數量為奇數,則被測點在多邊形內;如果交點的數量為偶數,則被測點在多邊形以外。

期間,有些特殊情況需要判斷,比如:

1. 射線剛好經過凸多邊形兩條相鄰邊的交點上的情況會導致重複判斷;

2.射線和多邊形的邊重合的情況。

先上js**。

function

isdotinpolygon(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分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...