判断点是否在多边形内

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断点是否在多边形内相关的知识,希望对你有一定的参考价值。

将大神的代码照搬写了一个JAVA版本,思路很简单,将这个点往多边形内每条边引射线,最终统计交点个数,如果为奇数个,说明在多边形内,偶数个说明在多边形外

射线是无限长的,多边形是有界的,一个点射出的射线经过多边形,如果在多边形内,那么会经历:进入-离开-进入-离开-......-最终离开的过程,交点总数为偶数个,同理在多边形内的话,则会经历离开多边形然后循环可能数量的进入和离开,交点总数为奇数

 

    public static boolean isPointInPolygons(double ALon, double ALat, List<double[]> pointList) {
        int iSum = 0, size;
        double dLon1, dLon2, dLat1, dLat2, dLon;
        if (pointList.size() < 3)
            return false;
        size = pointList.size();
        for (int i = 0; i < size - 1; i++) {
            double[] aPoint = pointList.get(i);
            double[] bPoint = pointList.get(i + 1);
            if (i == size - 1) {
                dLon1 = aPoint[0];
                dLat1 = aPoint[1];
                dLon2 = pointList.get(0)[0];
                dLat2 = pointList.get(0)[1];
            } else {
                dLon1 = aPoint[0];
                dLat1 = aPoint[1];
                dLon2 = bPoint[0];
                dLat2 = bPoint[1];
            }
            // 以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上
            if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {
                if (Math.abs(dLat1 - dLat2) > 0) {
                    // 得到 A点向左射线与边的交点的x坐标:
                    dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2);

                    // 如果交点在A点左侧(说明是做射线与 边的交点),则射线与边的全部交点数加一:
                    if (dLon < ALon)
                        iSum++;
                }
            }
        }
        if (iSum % 2 != 0) {
            return true;
        }
        return false;
        
    }

 

以上是关于判断点是否在多边形内的主要内容,如果未能解决你的问题,请参考以下文章

判断一个点是否在多边形内

判断一点是否在多边形内/判断是否在围栏内

判断点是否在凸多边形内

判断点是否在任意多边形内

如何判断点在一个区域内?用户绘制区域(射线法)判断点在多边形区域,报警区域

如何判断点在一个区域内?用户绘制区域(射线法)判断点在多边形区域,报警区域