• 判断点是否在多边形内


    将大神的代码照搬写了一个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;
            
        }
  • 相关阅读:
    SpringCloudStream实例
    Gateway环境搭建,通过YML文件配置
    Hystrix图形化监控
    Hystrix服务降级
    SpringBootのRedis
    springboot之缓存
    springboot整合JPA
    留言板
    Python 京东口罩监控+抢购
    2019年 自我总结
  • 原文地址:https://www.cnblogs.com/Ebird/p/7429211.html
Copyright © 2020-2023  润新知