是否有一种干净的 Java 方法可以将两个给定重叠多边形的点合并为一个多边形?
问问题
7336 次
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 回答