部落格為本人的學習筆記,多多學習,一起交流。
常見的判斷點與多邊形的位置關係有面積法,角度法以及射線法
射線法的思想為:以目標點為端點引一條射線,統計射線和多邊各邊的交點數目。如果交點個數為奇數,則點在多邊形的內部,反之則在多邊形外部。
以射線法的實現為例,**如下:
#write by heheyang
defin_or_out
(point,rangelist)
:#point為點,rangelist為多邊形的定點
#排除不在範圍內的點
rlon=
rlat=
for p in rangelist:0]
)1])
maxlon=
max(rlon)
maxlat=
max(rlat)
minlon=
min(rlon)
minlat=
min(rlat)
if(point[0]
> maxlon or point[0]
< minlon or point[1]
> maxlat or point[1]
< minlat)
:return
false
#構建各邊
s_list=
for i in
range(0
,len
(rangelist)):
s_list_x =
if i!=
len(rangelist)-1
:)1]
)else:)
0])#判斷射線與各邊的交點個數以及交點是否在邊
common=
0for i in
range(0
,len
(s_list)):
if s_list[i][1
][0]
-s_list[i][0
][0]
==0:if point[0]
==s_list[i][0
][0]
: common+=
1else
: y=
((s_list[i][1
][1]
-s_list[i][0
][1]
)/(s_list[i][1
][0]
-s_list[i][0
][0]
))*(point[0]
-s_list[i][0
][0]
)+s_list[i][0
][1]
if y==point[1]
:#考慮交點在邊的情況
p=true
elif y>point[1]
and y<=
max(s_list[i][0
][1]
,s_list[i][1
][1]
):common+=
1#判斷in or out
if common%2!=
0or p:
return
true
else
:return
false
程式是射線法的簡單實現,判斷點的多邊形的內部或者外部(內部包括:多邊形的邊及定點),如果在多邊形的內部函式返回true,反之false。
舉例:
point_list=[[
0,0]
,[4,
5],[
2,3]
,[3,
6]]rangelist=[[
0,0]
,[0,
5],[
5,5]
,[5,
0]]for point in point_list:
print
(in_or_out(point,rangelist)
)
判斷點是否在多邊形中 射線判斷法
1.叉乘判別法 只適用於凸多邊形 想 象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將 該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊...
判斷點在多邊形內演算法(射線法)
謝謝分享!點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段...
判斷點在多邊形內 射線法詳解
現有乙個點p x0,y0 多變形ptpolypon,判斷點p是否在多邊形內。判斷乙個點是否在多邊形內,我們可以從該點引出一條水平射線 任意射線都可,但水平便於計算 觀察射線與多變形的交點個數,如果交點個數為奇數,則該點在多邊形內,如果為偶數則在多邊形外。如圖 點在多邊形內,從該點做一條水平射線,與多...