通過射線法判斷點和多邊形的位置關系.適用於任意多邊形.
射線法:從目標點引出一條射線,查看和多邊形有多少個交點.如果交點是奇數個,說明在多邊形內部,否則在多邊形外部.(在多邊形上的情況,在計算中可以算出來,這里不說明這種情況.)
圖中,假設黑色為引出的射線.(因為在給出坐標的情況下,使用x=x0或y=y0的射線便於計算交點)其它線段是多邊形的邊和射線的可能位置情況.(還有兩點都在射線的上方或者下方,只需要判斷)
1. AB:兩點都在射線起始點的左側.這種情況下,射線一定不會和這條邊有交點
2. AC,AD:A在射線起始位置左側下方,C在射線起始位置右側上方
3. DE:均在射線起始點右側,一個在上方,一個在下方.
4. FG,HI:特殊情況,多邊形的頂點在射線上.
5. 其它情況:射線起始點在多邊形邊上/頂點上;多邊形的邊和射線平行/多邊形的點全部在射線的一側.
這里使用y=y0的射線對各種情況的判斷進行說明.
1.判斷給出的多邊形兩點的x坐標如果都在射線頂點左側,不計數,直接判斷下一條邊.
2.這種情況不能僅根據坐標本身判斷邊是否和射線相交.這種情況下,列出直線方程進行計算.
如果:
交點比射線起點x坐標大,說明有交點.
交點和起點x坐標相等,說明起點在多邊形上
交點比射線起點x坐標小,說明沒有交點
3.判斷邊的y坐標在射線兩側,x坐標都比射線起點大,直接進行計數,不再求交點
4.這種情況特殊.
針對FG,HI.它們的下一條邊的情況可能是虛線的兩種.這里認定在射線上的點均為在射線上方.(當然也可以認定為在射線下方,不過只需認定一種情況) 這樣的話,對於FG,是與射線相交的,HI是與射線不相交的.
進行這樣認定的原因,可以分析一下它下一條邊的情況.針對FG.認定了G在射線上方.那么下一條邊如果是下方的虛線,那么這條邊會被判斷為不在射線上;如果是上方的虛線,則可以判斷為在射線上.--------認定G在射線下方,仍然能夠得出相同結論:如果下一條邊是上方虛線,可以判斷多邊形和射線有交點;是下方虛線,可以判斷為多邊形和射線沒有交點.
5.這種情況均不進行交點計數.
總結:判斷邊上的點的y坐標是否在射線兩側,如果在射線兩側:
判斷交點和射線起始點的x0的大小.(實際上可以將一些情況區分出來,不計算交點,不過使用方程計算交點,就不需要考慮很多情況了)
偽代碼:
(x0,y0),<(x1,y1),(x2,y2)>
cnt=0;
graphArray
for(graphArray){
if(y1<=y0&&y2>y0 || y1>y0&&y2<=y0){//這里是上面描述的第四種情況里的HI情況.
int crossX = 0;
if(x1 == x2){
crossX = x1;
}
else{
crossX = line(point1,point2,y0)//point1,point2組成的直線和射線y0的交點
}
if(crossX>x0){
cnt++;
}
}
}
if(cnt%2 == 1){
點在多邊形內
}
參考代碼: