日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

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

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

一、開(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)題。

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