c#竖直射线法判断点是否再多边形里面
一、開(kāi)發(fā)環(huán)境:
? ? ? ? ? VS2017? ?C#winform
二、豎直射線法大致介紹
? ? ? ? ? 通過(guò)被判斷的點(diǎn)P(x0,y0)引出豎直的上下兩條射線,如果兩條射線與多變形的交點(diǎn)都為奇數(shù)個(gè),那么這個(gè)點(diǎn)再多邊形里面,反之,這個(gè)點(diǎn)在多邊形外面,反之,則在多邊形里面(前提:針對(duì)凸多邊形,但是如果在端點(diǎn)處細(xì)討論,那么同樣可以適用于凹多邊形,這里只介紹凸多邊形)
三、如何判斷豎直向下的射線是否與某一條邊會(huì)有交點(diǎn)。
? ? ? ?1、先介紹一些點(diǎn)和直線的關(guān)系? ? ?
? ?? ? ?1)對(duì)于p(x0,y0)判斷它在直線L:ax+by+c=0(a必須大于0)的上側(cè)還是下側(cè),我們知道如果
? ? ? ? ax0+by0+c>0(a>0),點(diǎn)p在直線L的下側(cè);
? ? ? ? ax0+by0+c=0? (a>0),點(diǎn)p在直線L上
? ? ? ? ax0+by0+c<0? (a>0),點(diǎn)p在直線L上側(cè)。
? ? ?如下圖:
? ? ? ?2)對(duì)于P(x0,y0),一條過(guò)P1(x1,y1),P2(x2,y2)的直線:(y2-y1)(x-x1)+(x2-x1)(y1-y)=0? ?(y2>y1)
? ? ? 那么只用判斷: f=(y2-y1)*(x0-x1)+(x2-x1)*(y1-y0)
? ? ?if :? f>0 則說(shuō)明點(diǎn)在直線的下側(cè),
? ? ? ? ? ?f=0 則說(shuō)明點(diǎn)在直線上
? ? ? ? ? ?f<0 則說(shuō)明點(diǎn)在直線上側(cè)
? ? ?2、開(kāi)始介紹算法(這里是豎直向下的射線)
? ? ?先介紹符號(hào):P(x0,y0)是需要判斷的點(diǎn),多變形的頂點(diǎn)序列Points[n],其中Points[n]=Points[0],交點(diǎn)個(gè)數(shù)countDown=0
? ? 1)對(duì)于每一條邊(Points[i],Points[i+1])進(jìn)行遍歷:p1(x1,y1)為邊上的兩個(gè)點(diǎn)Y坐標(biāo)大的那個(gè)點(diǎn),p2(x2,y2)為邊上兩個(gè)點(diǎn)Y坐標(biāo)小的那個(gè)點(diǎn)。xMin為兩個(gè)點(diǎn)較小的x坐標(biāo),xMax為兩個(gè)點(diǎn)較大的x坐標(biāo)
? ?2)如果x0不在范圍(xMin,xMax)中,說(shuō)明射線一定沒(méi)有交點(diǎn),i=i+1,跳到下一條邊進(jìn)行判斷。否則跳到第3)步
? ?3)f=(y2-y1)*(x0-x1)+(x2-x1)*(y1-y0)??
? ? ? ? ? ?if (f>0&&x0!=Points[i].X)? ? countDown+=1,i+=1,跳到第1)步(x0!=Points[i].X是為了每一個(gè)頂點(diǎn)只被訪問(wèn)一次)
? ? ? ? ? if(f==0&&x0!=Points[i].X)? ? ?說(shuō)明點(diǎn)在邊上,退出
? ? ? ? ? if(f<0)? i+=1;? 跳到第1)步
4)所有邊都被遍歷完,countDown為偶數(shù),說(shuō)明點(diǎn)在多邊形外,為奇數(shù),計(jì)算向上的射線的交點(diǎn)。這里就不介紹向上的射線的交點(diǎn)求法了。
?
等幾天貼代碼
? ? ?
? ? ? ?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的c#竖直射线法判断点是否再多边形里面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c#实现 改进弧长法判断点在多边形里面
- 下一篇: JavaSript实现调用google地