zoukankan      html  css  js  c++  java
  • 判断点是否在多边形内

    将大神的代码照搬写了一个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;
            
        }
  • 相关阅读:
    sqlserver 动态 sql语句的执行
    SqlServer位运算 权限设计
    更改主数据 的管理员账户
    如何查看dll 的PublicKeyToken
    varbinary 与 字符串 的互换函数
    analysis service 配置远程连接
    sqlserver字符串拆分(split)方法汇总
    openfile 安装备忘
    Lamp 在centos 中的安装
    Oracle查询表中的各列的列名,数据类型,以及类型长度
  • 原文地址:https://www.cnblogs.com/Ebird/p/7429211.html
Copyright © 2011-2022 走看看