判断一个点是否在指定区域内
2013-04-26 10:46
288 查看
using System.Drawing; private int IsLeft(Point P1, Point P2, Point P0) { int abc = 0; try { abc = ((P2.X - P1.X) * (P0.Y - P1.Y) - (P0.X - P1.X) * (P2.Y - P1.Y)); } catch (Exception ex) { Console.WriteLine("判断点是否在区域某顶点左边时出现异常:{0}", ex.ToString()); } return abc; } private bool PointInFences(Point pnt1, Point[] fencePnts) { int wn = 0, j = 0; //wn 计数器 j第二个点指针 try { for (int i = 0; i < fencePnts.Length; i++) {//开始循环 if (i == fencePnts.Length - 1) j = 0;//如果 循环到最后一点 第二个指针指向第一点 else j = j + 1; //如果不是 ,则找下一点 if (fencePnts[i].Y <= pnt1.Y) { // 如果多边形的点 小于等于 选定点的 Y 坐标 if (fencePnts[j].Y > pnt1.Y) { // 如果多边形的下一点 大于于 选定点的 Y 坐标 if (IsLeft(fencePnts[i], fencePnts[j], pnt1) > 0) { wn++; } } } else { if (fencePnts[j].Y <= pnt1.Y) { if (IsLeft(fencePnts[i], fencePnts[j], pnt1) < 0) { wn--; } } } } } catch (Exception ex) { Console.WriteLine("判断点和区域时出现异常:{0}", ex.ToString()); } if (wn == 0) return false; else return true; }
判断一个点是否在指定区域内
在图像处理时,我们会经常需要判断一个点是否位于多边形区域内,这里介绍2种比较巧妙的算法。射线法
第一种是射线法,算法思想非常巧妙:从待判断的点向某一个方向引射线,计算和多边形交点的个数,如果个数是偶数或者0则点在多边形外,如果是奇数,则在多边形内,如下图:这里有二种特殊情况:
1. 射线经过顶点:当射线经过顶点时,判断就会出现异常情况。 2. 点在边上:这种情况也不能用交点个数的奇偶性来判断了,要快速地判断这个点是否在边上。
C的实现如下:
参考自:Determining if a point lies on the interior of a polygon
改进:传统的射线法一开始就直接计算点和多边形的交点个数,这样的话,会花费大量的时间来作拓扑关系的判断,我们可以首先计算出最小外包矩形,迅速排除不在矩形内部的点,然后再做上面的判断。
第二种是也很巧妙
如下图:我们可以把多边形可以看做是一条从某点出发的闭合路,可以观察到在内部的点永远都在路的同一边。
给定线段的两个点P0(x0,y0)和P1(x1,y1),目标点P(x,y),它们有如下的关系:
计算(y - y0) (x1 - x0) - (x - x0) (y1 - y0)
如果答案小于0则说明P在线段的右边,大于0则在左边,等于0说明在线段上。
除了上面两种,还有很多方法
比如面积法:就是计算所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则点在该区域的内部。
这种方法计算量较大,多边形的面积计算也是比较麻烦;
还有夹角法:判断所有边和目标点的夹角和是否为360度,计算量同样很大。
http://vicdory.com/determining-if-a-point-lies-on-the-interior-of-a-polygon.html
相关文章推荐
- 判断一个点是否在指定区域内
- 如何判断一个指定的经纬度点是否落在一个多边形区域内?
- 在Android里如何判断一个指定的经纬度点是否落在一个多边形区域内
- 判断一个指定的经纬坐标是否落在一个多边形区域内?
- 如何判断一个指定的经纬度点是否落在一个多边形区域内?
- 判断一个点是否在指定区域内
- mysql 判断点是否在指定多边形区域内
- java中指定字符串是否包含一个字串。(比如判断邮箱是否含有@)
- 百度地图 判断一个标注点是否在多边形区域里
- 一个很有用的自定义函数(判断自然数是否包含2的指定次幂)
- 判断一个指定的Service是否存在的方法
- 百度地图 判断一个标注点是否在多边形区域里
- 如何判断一个指定的经纬度点是否落在一个多边形内
- js判断一个地图标注点是否在多边形区域里
- jquery判断点击事件是否指定区域
- 一个判断点是否在参数方程连续可微的封闭曲线界定的区域之内的好概念
- 如何判断一个指定的经纬度点是否落在一个多边形内
- iOS判断一个点是否在一个区域内
- 使用jquery判断一个元素是否含有一个指定的类(class)实例
- 怎么使用jquery判断一个元素是否含有一个指定的类(class)