1

是否有一种干净的 Java 方法可以将两个给定重叠多边形的点合并为一个多边形?

4

5 回答 5

8

您想要的是一个凸壳算法,它将采用一组点并返回包含原始点的最小点集。这可以及时完成n.log n

于 2012-07-02T08:57:24.127 回答
6

Area类支持添加闭合多边形。

于 2013-03-15T14:01:56.847 回答
6

Convex Hull 与添加不同。添加意味着制作一个看起来像两个多边形重叠的多边形,不一定是凸的。

于 2015-10-14T22:28:54.223 回答
5

您可以为此使用JTS(Java 拓扑套件)。

  • 创建你的多边形对象
  • 使用union方法,该方法将返回来自两个多边形的所有点的 Set

简单的代码示例:

  • 给定多边形 1(作为 WKT): POLYGON ((0 0, 0 10, 10 10, 10 0, 0 0))
  • 给定多边形 2(作为 WKT): POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))

    // create polygons
    Polygon p1 = new GeometryFactory().createPolygon(new Coordinate[]{new Coordinate(0, 0), new Coordinate(0,10), new Coordinate(10,10), new Coordinate(10,0), new Coordinate(0,0)});
    Polygon p2 = new GeometryFactory().createPolygon(new Coordinate[]{new Coordinate(5,5), new Coordinate(15,5), new Coordinate(15,15), new Coordinate(5,15), new Coordinate(5,5)});
    // calculate union
    Geometry union = p1.union(p2);
    // print as WKT
    System.out.println(union.toText());
    

结果是一个新的多边形:

POLYGON ((0 0, 0 10, 5 10, 5 15, 15 15, 15 5, 10 5, 10 0, 0 0))
于 2016-07-11T17:26:22.547 回答
0

使用@Charles Keepax 提供的算法,您可以执行以下操作:

public static Polygon mergePolygons(Polygon a, Polygon b) {
    // create arrays for border of each polygon
    Point[] a_pts = new Point[a.npoints];
    Point[] b_pts = new Point[b.npoints];
    // fill them in an array of Points instead of separate coords.
    Arrays.setAll(a_pts, i -> new Point(a.xpoints[i], a.ypoints[i]));
    Arrays.setAll(b_pts, i -> new Point(b.xpoints[i], b.ypoints[i]));
    // first merge 2 arrays into 1
    Point[] all_pts = (Point[]) mergeArrays(a_pts, b_pts);
    // apply Convex Hull on resulting array
    convexHull(all_pts, all_pts.length);

    // separate x and y coordinates back 
    int[] x_pts = new int[all_pts.length];
    int[] y_pts = new int[all_pts.length];
    Arrays.setAll(x_pts, i -> all_pts[i].x);
    Arrays.setAll(y_pts, i -> all_pts[i].y);
    // return polygon object using those coordinates
    return new Polygon(x_pts, y_pts, all_pts.length);
}

但是,@Lars 的解决方案当然更实用,这就是你可以用一种天真的方式做到这一点的方法。

于 2022-03-03T21:12:53.660 回答