将大神的代码照搬写了一个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;
        
    }

 

posted on 2017-08-25 18:01  菜鸟你够了  阅读(292)  评论(0编辑  收藏  举报