gpt4 book ai didi

java - 如何将多个矩形合并为一个多边形

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:44 24 4
gpt4 key购买 nike

我正在为这部分工作而苦苦挣扎。我故意不详细说明工作任务的上下文,以尝试将注意力集中在问题上。我必须将矩形合并为单个多边形,如附图所示,但我需要点列表,以便我可以将它们写成多边形形状(DOM 对象)以用于 Swing Canvas ,然后导出 SVG。

enter image description here

我知道每个矩形的原点,即左上角的 x 和 y 坐标 (float x, float y) 以及每个矩形的宽度 (float) 和高度 (float),因此我可以由此计算出坐标每个矩形的所有四个角,即顶部、右侧、底部、左侧、即 top = origin = x, y, right = x + width, bottom = x + width, y + height 和 left = x, y + height。

我有一个 List<Rectangle> rectangles并想要一种算法将此列表转换为单个多边形(List<Points>,其中一个点代表每个点的坐标(x,y),如标记为红色“x”的图表所示。

然后我将使用这个点列表在 DOM 中写出一个元素,最终以 SVG 格式打印网页。因此,我的最终结果必须是一个点列表(即用于在 SVG 中构建多边形形状的 x、y 坐标)。

我确实看到了这个答案,它做了类似的事情,但我不确定我是否可以将它应用到我的案例中 - 而且它是用 Python 而不是 Java 编写的:Merging multiple adjacent rectangles into one polygon

最佳答案

这是我和我的同事提出的解决方案。希望它可以帮助别人。

public class PolygonHelper {

public Polygon makePolygon(List<Rectangle> rectangles){
List<Point> points = calcPoints(rectangles);
return new Polygon(points);
}

private List<Point> calcPoints(List<Rectangle> rectangles) {
List<Point> ret = new ArrayList<>();

List<Float> yCoords = new ArrayList<>(getAllYCoords(rectangles));
yCoords.sort(Comparator.naturalOrder());

float previousLeftCoord = 0;
float previousRightCoord = 0;

for(float yCoord : yCoords) {
System.out.println("Considering yCoords "+ yCoord);
float minimumXLeftCoord = minXLeftCoord(yCoord, rectangles);
float maximumXRightCoord = maxXRightCoord(yCoord, rectangles);
System.out.println("min X: "+minimumXLeftCoord);
System.out.println("max X: "+maximumXRightCoord);

if(yCoord == yCoords.get(0)) {
ret.add(new Point(minimumXLeftCoord, yCoord));
ret.add(new Point(maximumXRightCoord, yCoord));

} else {

if(minimumXLeftCoord!=previousLeftCoord) {
ret.add(0, new Point(previousLeftCoord, yCoord));
ret.add(0, new Point(minimumXLeftCoord, yCoord));
} else {
ret.add(0, new Point(minimumXLeftCoord, yCoord));
}

if(maximumXRightCoord!=previousRightCoord) {
ret.add(new Point(previousRightCoord, yCoord));
ret.add(new Point(maximumXRightCoord, yCoord));
} else {
ret.add(new Point(maximumXRightCoord, yCoord));
}

}

previousLeftCoord = minimumXLeftCoord;
previousRightCoord = maximumXRightCoord;
System.out.println(ret);
}

return ret;

}

private Set<Float> getAllYCoords(List<Rectangle> rectangles) {
List<Float> allBottomYCoords = rectangles.stream().map(rectangle -> rectangle.getBottom().getY()).collect(Collectors.toList());
List<Float> allTopYCoords = rectangles.stream().map(rectangle -> rectangle.getTop().getY()).collect(Collectors.toList());

Set<Float> allCoords = new HashSet<>();
allCoords.addAll(allTopYCoords);
allCoords.addAll(allBottomYCoords);
return allCoords;
}

private float minXLeftCoord(Float y, List<Rectangle> rectangles) {
return rectanglesAtY(y, rectangles).stream().map(rect -> rect.getLeft().getX()).min(Comparator.naturalOrder()).get();
}

private float maxXRightCoord(Float y, List<Rectangle> rectangles) {
return rectanglesAtY(y, rectangles).stream().map(rect -> rect.getRight().getX()).max(Comparator.naturalOrder()).get();
}

private List<Rectangle> rectanglesAtY(Float y, List<Rectangle> rectangles) {
List<Rectangle> rectsAtYExcBottomLines = rectsAtYExcBottomLines(y, rectangles);

if(rectsAtYExcBottomLines.size()>0) {
// there are rectangles that are not closing here, so ignore those that are closing.
return rectsAtYExcBottomLines;
} else {
// there are only rectangle bottom lines so we need to consider them.
return rectsAtYIncBottomLines(y, rectangles);
}
}

private List<Rectangle> rectsAtYExcBottomLines(Float y, List<Rectangle> rectangles) {
return rectangles.stream()
.filter(rect -> rect.getTop().getY()<=y && rect.getBottom().getY()>y).collect(Collectors.toList());
}

private List<Rectangle> rectsAtYIncBottomLines(Float y, List<Rectangle> rectangles) {
return rectangles.stream()
.filter(rect -> rect.getTop().getY()<=y && rect.getBottom().getY()==y).collect(Collectors.toList());
}

}

关于java - 如何将多个矩形合并为一个多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com