判断点是否在一个任意多边形内几种方法
2015-12-11 18:46
423 查看
1.多边形面积算法(非凹多边形,凹多边形需要切割为凸多边形):
设要检测的点为P点。用P点连接多边形各顶点,假如P点在多边形以内,则顶点与P组成的三角形正好填充此多边形。反之,则不能。此时使用多边形面积计算公式,使P点作为参考点(a,b,c,.......,n为多边形定点)则有:
S = 0.5 * ( (a.x-p.x)*(a.y-p.y)-(b.x-p.x)*(b.y-p.y) +(b.x-p.x)*(b.y-p.y)-(c.x-p.x)*(c.y-p.y) +......... +
(n.x-p.x)*(n.y-p.y)-(a.x-p.x)*(a.y-p.y) )
如果P点不在多边形以内,则每个三角形的相对面积符号不会一致。由于0.5并不会影响我们的运算结果 所以只需要取每个三角形面积的符号(a.x-p.x)*(a.y-p.y)-(b.x-p.x)*(b.y-p.y) 如果一致则在多边形以内,反之则不在多边形以内。
2.水平/垂直交叉点数
如下左图,适用于所有多边形,增加一个通过测量点的横线(或任意直线),此直线与多边形边缘的交点,当测量点左右的交点都为奇数时,点在多边形以内。反之则不在。
但是如果测量点处于多边形边缘或顶点或下右3图的情况下时,结果将不准确,不过我们可以根据不同的情况作特殊处理来保证结果的正确性。
3.角度计算方式(非凹多边形,凹多边形需要切割为凸多边形)
设测量点为P,对于凸多边形,P到连续两点形成的夹角的角度和正好是360度(如下图),则可以得出结论,当角度和为360度的时候,点在多边形以内。
附 : 凹多边形判别
在几何学中,对凸边形的定义是对于任意一边,不在这个边上的顶点都在边的一侧。
附 : 凹多边形分割为多个凸多边形
设要检测的点为P点。用P点连接多边形各顶点,假如P点在多边形以内,则顶点与P组成的三角形正好填充此多边形。反之,则不能。此时使用多边形面积计算公式,使P点作为参考点(a,b,c,.......,n为多边形定点)则有:
S = 0.5 * ( (a.x-p.x)*(a.y-p.y)-(b.x-p.x)*(b.y-p.y) +(b.x-p.x)*(b.y-p.y)-(c.x-p.x)*(c.y-p.y) +......... +
(n.x-p.x)*(n.y-p.y)-(a.x-p.x)*(a.y-p.y) )
如果P点不在多边形以内,则每个三角形的相对面积符号不会一致。由于0.5并不会影响我们的运算结果 所以只需要取每个三角形面积的符号(a.x-p.x)*(a.y-p.y)-(b.x-p.x)*(b.y-p.y) 如果一致则在多边形以内,反之则不在多边形以内。
2.水平/垂直交叉点数
如下左图,适用于所有多边形,增加一个通过测量点的横线(或任意直线),此直线与多边形边缘的交点,当测量点左右的交点都为奇数时,点在多边形以内。反之则不在。
但是如果测量点处于多边形边缘或顶点或下右3图的情况下时,结果将不准确,不过我们可以根据不同的情况作特殊处理来保证结果的正确性。
3.角度计算方式(非凹多边形,凹多边形需要切割为凸多边形)
设测量点为P,对于凸多边形,P到连续两点形成的夹角的角度和正好是360度(如下图),则可以得出结论,当角度和为360度的时候,点在多边形以内。
附 : 凹多边形判别
在几何学中,对凸边形的定义是对于任意一边,不在这个边上的顶点都在边的一侧。
附 : 凹多边形分割为多个凸多边形
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例