判断点是否在多边形内部
来源:互联网 发布:cs1.6弹道优化脚本 编辑:程序博客网 时间:2024/05/14 02:08
如何判断一个点是否在多边形内部?
(1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。
(2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。
(3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。
具体做法:将测试点的Y坐标与多边形的每一个点进行比较,会得到一个测试点所在的行与多边形边的交点的列表。在下图的这个例子中有8条边与测试点所在的行相交,而有6条边没有相交。如果测试点的两边点的个数都是奇数个则该测试点在多边形内,否则在多边形外。在这个例子中测试点的左边有5个交点,右边有三个交点,它们都是奇数,所以点在多边形内。
算法图解:
C++实现
/*Globals which should be set before calling this function: int polySides = how many corners the polygon has float polyX[] = horizontalcoordinates of corners float polyY[] = verticalcoordinates of corners float x,y = point to be tested (Globals are used in this example for purposes of speed. Change as desired.) Thefunction will return YES if the point x,y is inside the polygon, or NOif it is not. If the point is exactly on the edge of the polygon, then the function may return YES or NO. Note that division by zero is avoided because the division is protected bythe "if" clause which surrounds it.*/bool pointInPolygon(int polySizes,float x,float y,float polyX[],float polyY[]) { int i,j=polySizes-1; bool oddNodes = false; for (i=0;i<polySizes; i++) { if((polyY[i]< y && polyY[j]>=y || polyY[j]<y && polyY[i]>=y) && (polyX[i]<=x || polyX[j]<=x)) { oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x); /* if(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x) { oddNodes=!oddNodes; }*/ } j=i; } return oddNodes;}
参考:
1、http://blog.csdn.net/hjh2005/article/details/9246967
2、http://www.cnblogs.com/luxiaoxun/p/3722358.html
阅读全文
0 0
- 判断一个点是否在多边形内部
- 判断一个点是否在多边形内部
- C判断点是否在多边形内部
- 判断一个点是否在多边形内部
- 判断点是否在多边形内部
- 判断点是否在多边形内部
- 判断点是否在多边形内部
- 判断点是否在多边形内部
- hdu1756判断点是否在多边形内部
- 判断点是否在多边形内部
- 判断点是否在多边形内部
- 判断一个点是否在一个多边形内部
- ZOJ1081 Points Within(判断点是否在多边形内部)
- 判断一个点是否在多边形内部的问题
- 判断 点 是否 在 任意多边形 内部 采用射线法
- 判断一个点是否在一个多边形内部
- 判断点是否在多边形内部的函数
- 判断点是否在多边形内部的四种方法
- hibernate主键生成机制
- androidStudio设置字体
- msf生成shellcode msfshe
- 自定义添加KAFKA服务启动时报错
- 异地,多活,Mysql数据库改造
- 判断点是否在多边形内部
- jquery导入Excel文件
- Android读取sql文件并导入数据库
- ultraedit 如何添加Verilog语法高亮显示功能
- 15算法课程 189. Rotate Array
- marquee 标签 实现循环滚动 公告滚动
- sklearn 自带手写字体数据集(二)
- >问题:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
- 第二章(2.1线性表的类型定义)