标签:
正在做的一个项目,要判断点是否在多边形内,实现语言可以是C#或java,两个都是需要的,其实两种语言都有自己的类库方法可以判断,百度一下就可以找到,多边形需要考虑凹多边形,有个比较好理解的实现方法就是通过单边射线与多边形各边交点的奇偶数来判断,如果交点为奇数则可以判断是在多边形内,但这只是一个大致的想法,具体实现还要考虑与端点相交的特殊情况,我们以水平单边射线为例,具体步骤如下:
1.遍历所有的边(至少有一个端点的横坐标小于点的横坐标),如果点在某条边上,直接退出,可以用返回0代表;
2.最一般的情况,交点都不是多边形端点,累加交点个数即可;
3.如果有交点为端点,为了使算法有效,我们需要定义何为有效的相交,将纵坐标大于等于点的纵坐标为一侧,纵坐标小于点的纵坐标为一侧,只有相交端点所在的边满足在射线两侧的条件才算是有效的相交;
4.如果交点个数为奇数则在多边形内,否则在多边形外(包括0);
Java实现如下
/** * 判断点是否在多边形内,可以应用于复杂凹多边形 * @return 如果在边上返回0,在内部返回1,在外部返回-1 */ public int isInPolygon(double x, double y, double[] xArray, double[] yArray) { int sidesCount = xArray.length; if(sidesCount < 3) return -1; //采用水平左射线计算交点个数 int intersectionCount = 0; for(int i = 0; i < sidesCount; i++) { int j = (i + 1)%sidesCount;//i,j代表边的两个端点 if(xArray[i] > x && xArray[j] > x )//排除右侧的边 continue; if((y - yArray[i])*(y-yArray[j]) > 0)//排除不相交的边 continue; if((y-yArray[i])*(x-xArray[j]) == (y-yArray[j])*(x-xArray[i]))//判断是否点在边上 return 0; if(yArray[i] < y || yArray[j] < y)//判断是否点在边的两侧 intersectionCount++; } if(intersectionCount % 2 == 1) return 1; else return -1; }
时间有点晚了也没有试,如果有问题后续再完善
参考资料:http://blog.csdn.net/hjh2005/article/details/9246967
标签:
原文地址:http://www.cnblogs.com/EBGDAE/p/4764842.html