您的位置:首页 > 理论基础 > 计算机网络

判断某个点是否在一个多边形中

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,那么两线相交,否则两线不相交.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  测试 c null 网络 xp