Java 如何找到两个或多个多边形之间的最小距离?

Java 如何找到两个或多个多边形之间的最小距离?,java,javascript,google-api,Java,Javascript,Google Api,我想找到两个多边形之间的最小距离。但是我有一些问题要找。我是谷歌地图新手,你能帮我吗?我有那些坐标要用 polygonArray = [[ new google.maps.LatLng(40.56389453066509,33.739013671875), new google.maps.LatLng(40.39676430557206,32.135009765625), new google.maps.LatLng(39.87601941962

我想找到两个多边形之间的最小距离。但是我有一些问题要找。我是谷歌地图新手,你能帮我吗?我有那些坐标要用

    polygonArray = [[
       new google.maps.LatLng(40.56389453066509,33.739013671875),
       new google.maps.LatLng(40.39676430557206,32.135009765625),
       new google.maps.LatLng(39.87601941962116,36.046142578125)
    ]];

提前谢谢。

您需要一个计算两点之间距离、多边形中心等的几何体库。请看这个。

您需要一个计算两点之间距离、多边形中心等的几何体库。请看这个。

如果您决定编写自己的代码:

对于2个不重叠的多边形,最简单的代码(从编程角度来看)将遍历一个多边形的点,并找到一个多边形中的每个点与第二个多边形中的每条线之间的距离,然后对第二个多边形(每一点到每一条线)执行相同的操作


如果不确定多边形是否重叠,还必须检查一个多边形中的每一条线是否与第二个多边形中的任何其他线相交(只需对一个多边形执行此操作)

如果您决定编写自己的代码:

对于2个不重叠的多边形,最简单的代码(从编程角度来看)将遍历一个多边形的点,并找到一个多边形中的每个点与第二个多边形中的每条线之间的距离,然后对第二个多边形(每一点到每一条线)执行相同的操作


如果不确定多边形是否重叠,还必须检查一个多边形中的每一条线是否与第二个多边形中的任何其他线相交(只需对一个多边形执行此操作)

下面的代码部分解决了这个问题,但仍然需要通过检测更靠近其他多边形的边上的点来增强,因为这部分仅适用于顶点

        static double solve(List<List<Integer>> p, List<List<Integer>> q) {
        double minLength = 100000000;
        for (List<Integer> qq : q) {
            for (List<Integer> pp : p) {
                double current = distanceBTWPoints(pp, qq);
                if (current < minLength) {
                    minLength = current;
                }
            }
        }
        System.out.println(minLength);
        return minLength;
    }

    static double distanceBTWPoints(List<Integer> p, List<Integer> q) {
        double xDiff = q.get(0) - p.get(0);
        double yDiff = q.get(1) - p.get(1);
//        if(xDiff==0 || yDiff==0)
//            return 0;
        System.out.println(+p.get(0) + "  " + q.get(0) + "  " + p.get(1) + "  " + q.get(1) + " x:" + xDiff + "  y: " + yDiff + " p: " + ((xDiff * xDiff) + (yDiff * yDiff)) + " VAl= " + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
//        System.out.println("p.get(0): "+p.get(0) +"  q.get(0) :"+q.get(0) +"  p.get(1):  "+p.get(1) +"  q.get(1): "+q.get(1) +" xDiff: " + xDiff + "  yDiff: " + yDiff + " plus: "+((xDiff * xDiff) + (yDiff * yDiff))+ " VAl= " + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
        System.out.println("--" + Math.hypot(xDiff, yDiff));
        System.out.println("--" + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
        return Math.hypot(xDiff, yDiff);
    }
静态双解算(列表p,列表q){
双倍最小长度=100000000;
对于(列表qq:q){
对于(列表pp:p){
双电流=距离BTW点(pp,qq);
如果(当前<最小长度){
最小长度=电流;
}
}
}
系统输出打印项次(最小长度);
返回最小长度;
}
静态双距离BTW点(列表p、列表q){
双xDiff=q.get(0)-p.get(0);
双yDiff=q.get(1)-p.get(1);
//如果(xDiff==0 | | yDiff==0)
//返回0;
System.out.println(+p.get(0)+“+q.get(0)++p.get(1)+“+q.get(1)+”x:“+xDiff+”y:“+yDiff+”p:”+((xDiff*xDiff)+(yDiff*yDiff))+“VAl=“+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
//System.out.println(“p.get(0):“+p.get(0)+”q.get(0):“+q.get(0)+”p.get(1):“+p.get(1)+”q.get(1):“+q.get(1)+”xDiff:“+xDiff+”yDiff:“+yDiff+”+((xDiff*xDiff)+(yDiff*yDiff))+“VAl=”+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
System.out.println(“-”+Math.hypot(xDiff,yDiff));
System.out.println(“-”+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
返回Math.hypot(xDiff,yDiff);
}

下面的代码部分解决了问题,但仍然需要通过检测更靠近其他多边形的边上的点来增强,因为此部分仅适用于顶点

        static double solve(List<List<Integer>> p, List<List<Integer>> q) {
        double minLength = 100000000;
        for (List<Integer> qq : q) {
            for (List<Integer> pp : p) {
                double current = distanceBTWPoints(pp, qq);
                if (current < minLength) {
                    minLength = current;
                }
            }
        }
        System.out.println(minLength);
        return minLength;
    }

    static double distanceBTWPoints(List<Integer> p, List<Integer> q) {
        double xDiff = q.get(0) - p.get(0);
        double yDiff = q.get(1) - p.get(1);
//        if(xDiff==0 || yDiff==0)
//            return 0;
        System.out.println(+p.get(0) + "  " + q.get(0) + "  " + p.get(1) + "  " + q.get(1) + " x:" + xDiff + "  y: " + yDiff + " p: " + ((xDiff * xDiff) + (yDiff * yDiff)) + " VAl= " + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
//        System.out.println("p.get(0): "+p.get(0) +"  q.get(0) :"+q.get(0) +"  p.get(1):  "+p.get(1) +"  q.get(1): "+q.get(1) +" xDiff: " + xDiff + "  yDiff: " + yDiff + " plus: "+((xDiff * xDiff) + (yDiff * yDiff))+ " VAl= " + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
        System.out.println("--" + Math.hypot(xDiff, yDiff));
        System.out.println("--" + Math.sqrt((xDiff * xDiff) + (yDiff * yDiff)));
        return Math.hypot(xDiff, yDiff);
    }
静态双解算(列表p,列表q){
双倍最小长度=100000000;
对于(列表qq:q){
对于(列表pp:p){
双电流=距离BTW点(pp,qq);
如果(当前<最小长度){
最小长度=电流;
}
}
}
系统输出打印项次(最小长度);
返回最小长度;
}
静态双距离BTW点(列表p、列表q){
双xDiff=q.get(0)-p.get(0);
双yDiff=q.get(1)-p.get(1);
//如果(xDiff==0 | | yDiff==0)
//返回0;
System.out.println(+p.get(0)+“+q.get(0)++p.get(1)+“+q.get(1)+”x:“+xDiff+”y:“+yDiff+”p:”+((xDiff*xDiff)+(yDiff*yDiff))+“VAl=“+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
//System.out.println(“p.get(0):“+p.get(0)+”q.get(0):“+q.get(0)+”p.get(1):“+p.get(1)+”q.get(1):“+q.get(1)+”xDiff:“+xDiff+”yDiff:“+yDiff+”+((xDiff*xDiff)+(yDiff*yDiff))+“VAl=”+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
System.out.println(“-”+Math.hypot(xDiff,yDiff));
System.out.println(“-”+Math.sqrt((xDiff*xDiff)+(yDiff*yDiff));
返回Math.hypot(xDiff,yDiff);
}

这把钉子钉得很好。好的,这把钉子钉得很好。好的。