c#实现 改进弧长法判断点在多边形里面
一、开发环境:
VS2017,C# winform窗口程序
二、不同点
和网上的介绍不同,我也 不清楚是为什么,我去实现别的博客的思路,始终是在象限相差为2的地方会判断不正确,所以我自己思考了一种方法来进行这个地方的处理。
三、算法思路解释
1、为了介绍方便,先规定符号:
将需要判断的点叫做:centerPoint
多边形的顶点序列是:points[n]
第i个点为:points[i]
points[n]对centerPoint的相对位置,也就是将坐标原点放在centerPoints后,每个points[i]的位置变为relativePoints[i]
同时最后一个点和第一个点相同:即points[n]=points[0]
2、介绍:
1)、我们知道圆的弧长都是,如果centerPoints在一个多边形里面,那么将多边形按顶点顺序映射到centerPoint的弧长必定等于,如果centerPoint在多边形的外面,那么中心投影的弧长为0。(当然,这个弧长是规定了方向的,方向相反会抵消投影的弧长)
2)、于是就这样进行编程:
从relativePoints[0]出发,
当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)的左侧还是右侧,我们知道如果
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、应用:
分为以下四种情况,
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: 总弧长减去
等几天再给出代码
总结
以上是生活随笔为你收集整理的c#实现 改进弧长法判断点在多边形里面的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: c# winform实现输出数据到Con
- 下一篇: c#竖直射线法判断点是否再多边形里面