日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

c#竖直射线法判断点是否再多边形里面

發(fā)布時間:2025/4/16 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#竖直射线法判断点是否再多边形里面 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、開發(fā)環(huán)境:

? ? ? ? ? VS2017? ?C#winform

二、豎直射線法大致介紹

? ? ? ? ? 通過被判斷的點P(x0,y0)引出豎直的上下兩條射線,如果兩條射線與多變形的交點都為奇數(shù)個,那么這個點再多邊形里面,反之,這個點在多邊形外面,反之,則在多邊形里面(前提:針對凸多邊形,但是如果在端點處細討論,那么同樣可以適用于凹多邊形,這里只介紹凸多邊形)

三、如何判斷豎直向下的射線是否與某一條邊會有交點。

? ? ? ?1、先介紹一些點和直線的關(guān)系? ? ?

? ?? ? ?1)對于p(x0,y0)判斷它在直線L:ax+by+c=0(a必須大于0)的上側(cè)還是下側(cè),我們知道如果

? ? ? ? ax0+by0+c>0(a>0),點p在直線L的下側(cè);

? ? ? ? ax0+by0+c=0? (a>0),點p在直線L上

? ? ? ? ax0+by0+c<0? (a>0),點p在直線L上側(cè)。

? ? ?如下圖:

? ? ? ?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 則說明點在直線的下側(cè),

? ? ? ? ? ?f=0 則說明點在直線上

? ? ? ? ? ?f<0 則說明點在直線上側(cè)

? ? ?2、開始介紹算法(這里是豎直向下的射線)

? ? ?先介紹符號:P(x0,y0)是需要判斷的點,多變形的頂點序列Points[n],其中Points[n]=Points[0],交點個數(shù)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為偶數(shù),說明點在多邊形外,為奇數(shù),計算向上的射線的交點。這里就不介紹向上的射線的交點求法了。

?

等幾天貼代碼

? ? ?

? ? ? ?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的c#竖直射线法判断点是否再多边形里面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。