判断点是否在多边形范围内有很多方法,我这里选的是一个比较直观简单的方法,就是取过多边形中心点的一条水平(或垂直)的割线,计算位于中心点某一侧(左或右,只用一侧)的割线与多边形的交点数,如果是奇数,则点位于多边形内;如果为偶数,则位于多边形外。这个判断要过滤割线正好过多边形的一个结点的情况。
一侧割线与多边形有偶数个交点,则点在多边形外
一侧割线与多边形只有奇数个交点,则点在多边形内
一侧割线穿过多边形的结点,这种情况单独处理,其实就是把判断条件加个逻辑奇偶切换状态
bool CGeoUtils::isPtInRegion(CGeoXY* pXY, int nPointCount, double dx, double dy, double dOffset)
{
double dx1,dy1,dx2,dy2;
int nLeftCount,nRightCount; //射线左右交点个数}
double dxx,dyy;
nLeftCount = 0;
nRightCount = 0;
for (int i = 0;i < nPointCount - 1;i++){
dx1 = pXY[i].dx;
dy1 = pXY[i].dy;
dx2 = pXY[i + 1].dx;
dy2 = pXY[i + 1].dy;
getIntersectedPoint(dx - 10,dy,dx,dy,dx1,dy1,dx2,dy2,dxx,dyy,2);
if (dxx < dx && isPtInRect(dxx,dyy,dx1,dy1,dx2,dy2)) nLeftCount++;
}
if (nLeftCount % 2 != 0)
return true;
else
return false;
}