判断点坐标是否在多边形坐标集合内算法整理

/**
 * @author yaoxin
 * @date 2018/7/30上午11:04
 */
public class CoordinateTest {

    public static void main(String[] args) {
        // 多边形经度数组
        double[] lon = {113.314882,113.355845,113.370289,113.356779,113.338238,113.330979,113.313588,113.323865,113.314882};
        // 多边形纬度数组
        double[] lat = {23.163055,23.167042,23.149564,23.129758,23.13913,23.124706,23.140858,23.158204,23.163055};
        // 测试在多边形内的点
        boolean inAccurateArea = isInAccurateArea(113.330908, 23.155678, lon, lat);
        System.out.println(inAccurateArea);
        // 测试不在多边形内的点
        boolean outAccurateArea = isInAccurateArea(113.33831, 23.137335, lon, lat);
        System.out.println(outAccurateArea);
    }

    /**
     * 从已知坐标向多边形划线,如果为偶数说明点在多边形外,奇数说明在多边形内
     *
     * @param pointLon
     * @param pointLat
     * @param lon
     * @param lat
     * @return
     */
    private static boolean isInAccurateArea(double pointLon, double pointLat, double[] lon,
                                            double[] lat) {
        // 代表有几个交点
        int vertexNum = lon.length;
        boolean result = false;

        for (int i = 0, j = vertexNum - 1; i < vertexNum; j = i++) {
            // 满足条件,与多边形相交一次,result布尔值取反一次,奇数个则在区域内
            if ((lon[i] > pointLon) != (lon[j] > pointLon)
                    && (pointLat < (lat[j] - lat[i]) * (pointLon - lon[i]) / (lon[j] - lon[i])
                    + lat[i])) {
                result = !result;
            }
        }
        return result;
    }
}

数学问题,从已知坐标画射线,如果穿过多边形是奇数说明在多边形内,如果为偶数说明在多边形外

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值