c#实现 改进弧长法判断点在多边形里面
一、開(kāi)發(fā)環(huán)境:
? ? VS2017,C# winform窗口程序
二、不同點(diǎn)
? ? ?和網(wǎng)上的介紹不同,我也 不清楚是為什么,我去實(shí)現(xiàn)別的博客的思路,始終是在象限相差為2的地方會(huì)判斷不正確,所以我自己思考了一種方法來(lái)進(jìn)行這個(gè)地方的處理。
三、算法思路解釋
1、為了介紹方便,先規(guī)定符號(hào):
? ?將需要判斷的點(diǎn)叫做:centerPoint
? ?多邊形的頂點(diǎn)序列是:points[n]
? ?第i個(gè)點(diǎn)為:points[i]
? ?points[n]對(duì)centerPoint的相對(duì)位置,也就是將坐標(biāo)原點(diǎn)放在centerPoints后,每個(gè)points[i]的位置變?yōu)閞elativePoints[i]
? ?同時(shí)最后一個(gè)點(diǎn)和第一個(gè)點(diǎn)相同:即points[n]=points[0]
2、介紹:
? ?1)、我們知道圓的弧長(zhǎng)都是,如果centerPoints在一個(gè)多邊形里面,那么將多邊形按頂點(diǎn)順序映射到centerPoint的弧長(zhǎng)必定等于,如果centerPoint在多邊形的外面,那么中心投影的弧長(zhǎng)為0。(當(dāng)然,這個(gè)弧長(zhǎng)是規(guī)定了方向的,方向相反會(huì)抵消投影的弧長(zhǎng))
? 2)、于是就這樣進(jìn)行編程:
? ? ? ? 從relativePoints[0]出發(fā),
? ? ? ? 當(dāng)relativePoints[i+1]比relativePoints[i]象限相同的時(shí)候,弧長(zhǎng)保持不變
? ? ? ? 當(dāng)relativePoints[i+1]比relativePoints[i]象限增加1的時(shí)候,弧長(zhǎng)加上
? ? ? ? 當(dāng)relativePoints[i+1]比relativePoints[i]象限減少1的時(shí)候,弧長(zhǎng)減去
? ? ? ? 當(dāng)relativePoints[i+1]比relativePoints[i]象限增加2或則減少2的時(shí)候,弧長(zhǎng)增加或者減少,如何增減,第三部分細(xì)講;
? ?3)當(dāng)所有頂點(diǎn)都遍歷完之后,如果總的弧長(zhǎng)=或者,說(shuō)明centerPoint在多邊形里面,總的弧長(zhǎng)=0,說(shuō)明centerPoint在多邊形外面。
三、在relativePoints[i+1]比relativePoints[i]的象限相差2詳解
? 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、應(yīng)用:
? ? ??
? ? ? 分為以下四種情況,
? ? ? 1)當(dāng)relativePoints[i+1]=(x2,y2)在第一象限,relativePoints[i]=(x1,y1)在第三象限的時(shí)候:
? ? 那么直線為:? (y2-y1>0)
? ? 對(duì)于點(diǎn)屏幕上任意一點(diǎn)P(x0,y0):
? ? ?f>0:? ? ? ? 總弧長(zhǎng)加上
? ? ?f=0:? ? ? ? ?P(x0,y0)在多邊形邊上
? ? ?f<0:? ? ? ? ?總弧長(zhǎng)減去
?
? ? ? 2)當(dāng)relativePoints[i+1]=(x2,y2)在第三象限,relativePoints[i]=(x1,y1)在第一象限的時(shí)候:
? ? 那么直線為:(y1-y2>0)
? ? 對(duì)于點(diǎn)屏幕上任意一點(diǎn)P(x0,y0):
? ? ?f>0:? ? ? ? 總弧長(zhǎng)減去
? ? ?f=0:? ? ? ? ?P(x0,y0)在多邊形邊上
? ? ?f<0:? ? ? ? ?總弧長(zhǎng)加上
3)當(dāng)relativePoints[i+1]=(x2,y2)在第二象限,relativePoints[i]=(x1,y1)在第四象限的時(shí)候:
? ? 那么直線為:? (y2-y1>0)
? ? 對(duì)于點(diǎn)屏幕上任意一點(diǎn)P(x0,y0):
? ? ?f>0:? ? ? ? 總弧長(zhǎng)減去
? ? ?f=0:? ? ? ? ?P(x0,y0)在多邊形邊上
? ? ?f<0:? ? ? ? ?總弧長(zhǎng)加上
? 4)當(dāng)relativePoints[i+1]=(x2,y2)在第四象限,relativePoints[i]=(x1,y1)在第二象限的時(shí)候:
? ? 那么直線為:(y1-y2>0)
? ? 對(duì)于點(diǎn)屏幕上任意一點(diǎn)P(x0,y0):
? ? ?f>0:? ? ? ? 總弧長(zhǎng)加上
? ? ?f=0:? ? ? ? ?P(x0,y0)在多邊形邊上
? ? ?f<0:? ? ? ? ?總弧長(zhǎng)減去
?
等幾天再給出代碼
?
? ??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的c#实现 改进弧长法判断点在多边形里面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c# winform实现输出数据到Con
- 下一篇: c#竖直射线法判断点是否再多边形里面