crossing-ray方法判断点在封闭多边形内部

判断一个点在多边形内:crossing-ray方法

核心思想

  • 过点作一条射线,与多边的交点,交点个数为奇数表明该点在多边形内部,交点个数为偶数表明该点在多边形外部。

题目及代码

  • 几何计算简化如下:
    点(x,y) 为坐标点,coords[x1,y1,x2,y2,x3,y3,x4,x4,…,x1,y1]为连续封闭区域坐标点。判断点(x,y)是否在多边形内部。
  • 步骤1:每次遍历相邻的两点,判断给定点的射线(此处采用平行于x轴的向右不断延伸射线)是否存在交点。
  • 步骤2:是否存在交点的判别条件为:利用两点式构造线段,代入给定点纵坐标y,判断x坐标值xLine是否大于给定点横坐标x,大于则存在1个交点。
  • 步骤3:最终根据交点个数的奇偶,判断是否存在于封闭多边形内部。
  • 代码
class Solution {
    public boolean isPointInPolygon(int x, int y, int[] coords) {
        int n = coords.length;
        int crossPoint = 0;
        for (int i = 0;i < n - 2;i += 2){
            int x1 = (int)coords[i],y1 = (int)coords[i + 1];
            int x2 = (int)coords[i + 2],y2 = (int)coords[i + 3];
            if (y1 == y2) continue;
            else if (y < Math.min(y1,y2)) continue;
            else if (y >= Math.max(y1,y2)) continue;
            double xLine = (y - y1) * (x2 - x1) / (y2 - y1) + x1;
            if (xLine > x) {
                System.out.println(x1 + "," + y1 + "--" + x2 + "," + y2);
                ++crossPoint;
            }
        }
        System.out.println(crossPoint);
        return crossPoint % 2 == 1;
    }
}

注意

  • 点必须严格在多边形内部,不在边界上。
  • 射线与多边形交于多边形端点时,切记仅需计算一次。

此处等号的近取一次,避免端点重复计算。
else if (y < Math.min(y1,y2)) continue;
else if (y >= Math.max(y1,y2)) continue;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值