判断点是否在多边形内

判断点是否在多边形范围内有很多方法,我这里选的是一个比较直观简单的方法,就是取过多边形中心点的一条水平(或垂直)的割线,计算位于中心点某一侧(左或右,只用一侧)的割线与多边形的交点数,如果是奇数,则点位于多边形内;如果为偶数,则位于多边形外。这个判断要过滤割线正好过多边形的一个结点的情况。

 

 

一侧割线与多边形有偶数个交点,则点在多边形外

一侧割线与多边形只有奇数个交点,则点在多边形内

 

一侧割线穿过多边形的结点,这种情况单独处理,其实就是把判断条件加个逻辑奇偶切换状态

 

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值