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