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