判断某个点是否在一个多边形中
2008-06-26 18:22
411 查看
BOOL Geometry::PtInPolygon( CPoint *points, int nSize, CPoint pt ) { if ( points == NULL || nSize < 3 ) { return FALSE; } int i, j; BOOL c = FALSE; int x = pt.x; int y = pt.y; for (i = 0, j = nSize-1; i < nSize; j = i++) { // 判断点是否在某条线段上 if (PtInSegment(x, y, points.x, points.y, points[j].x, points[j].y)) { return TRUE; } // 否则就判断是否改变奇偶性 if ((((points.y <= y) && (y < points[j].y)) || ((points[j].y <= y) && (y < points.y))) && //可以以X或Y来判断,这里选择用Y来判断,只有在当前线段高度内,当前线段才有可能改变点的奇偶值。 (x < (points[j].x - points.x) * (y - points.y) / (points[j].y - points.y) + points.x)) //判断是在线段的那一边(左边还是右边)。 { c = !c; } } return c; } // 判断一点是否在指定线段中 BOOL Geometry::PtInSegment( double x, double y, double ax, double ay, double bx, double by ) { if (((x<=ax && x>=bx) || (x<=bx && x>=ax)) && ((y<=ay && y>=by) || (y<=by && y>=ay))) { if ( ax == bx ) return TRUE; double result = (by-ay)/(bx-ax) - (y-ay)/(x-ax); return fabs(result) < 0.0001; } return FALSE; }判断点是否在多边形中的方式:搜索网络资源,发现判断点是否在多边形内的方式一般是以点为射线端点,向另一无穷远处做射线,判断此条射线与多边形各条边的相交情况,如果相交次数为奇数,认为点在多边形内或在多边形上,否则,认为点在多边形外.如图
这个方法无非就是判断相交次数.具体操作时,可以简化一下:
看上图,如果要判断p1x,p1y点是否在多边形内,只需要取能够与之相交的线段进行判断而已.我这里恒认为x轴为0,y轴与测试点相同的点为射线的另一段,那么,只有y值在测试点p1y上下的线段才是我们要测试的线段,比如上图中的x3,y3和x4,y4,那么有此条件,判断设想是否和x3y3x4y4相交无非就是判断p1.X > Max(x3.X,x4.X)而已,如果成立,则射线与x3y3x4y4线段相交,如果线段的两个端点的Y值均大于或均小于p1的Y值,则无判断的必要.因为它们不可能相交.如果是p2xp2y的情况则需要做跨立判断,因为p2x介于x4x和x5x之间,p2y介于x4y和x5y之间.假设,p2和x4x5相交,那么它们的交点tmpP的X必定小于p2X,tmpY必定等于p2Y,我们做x4y4x5y5的直线方程:ax + by + c = 0a = y5-y4b = x5-x4c = (x5-x4)y4 –(y5-y4)x4令y=p2Y;那么x = (x5-x4)p2Y + ((x5-x4)y4 –(y5-y4)x4)/(y4-y5)如果x < p2X,那么两线相交,否则两线不相交.
相关文章推荐
- Java 判断一个点是否在多边形区域内【转】
- 如何判断一个指定的经纬度点是否落在一个多边形内
- 判断一个点是否在多边形内部
- openlayers2 开发如何判断一个marker所在的点是否在一个多边形内部
- 判断一个点是否在多边形区域内
- 判断一个点是否在多边形内部 [2] 射线法实现
- 如何判断一个点是否在一个多边形内部(有向面积)
- 判断一个点是否在多边形内部
- 如何判断一个点是否在一个多边形内部(转)
- 判断一个点是否在一个多边形内部
- java实现判断一个经纬度坐标是否在一个多边形内(经自己亲测)
- [转]判断一个点是否落在多边形内
- POJ 3335 判断一个多边形是否存在核
- 判断一个点是否在多边形内(java)
- Mysql中判断一个点是否落在多边形内。
- 利用百度api判断已知经纬度的一个点是否在多边形内
- 判断一个点是否在多边形区域内
- 判断一个点是否位于一个凸多边形内的方法
- geotools判断一个点是否在多边形上
- MySQL中判断一个点是否落在多边形内