- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为这部分工作而苦苦挣扎。我故意不详细说明工作任务的上下文,以尝试将注意力集中在问题上。我必须将矩形合并为单个多边形,如附图所示,但我需要点列表,以便我可以将它们写成多边形形状(DOM 对象)以用于 Swing Canvas ,然后导出 SVG。
我知道每个矩形的原点,即左上角的 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/
我已经实现了 Bentley-Ottmann-algorithm检测多边形-多边形交叉点。这通常非常有效:由于多边形不自相交,因此两个多边形的线段并集中的任何线段相交表明两个多边形相交。 但是如果我看
我在 Silverlight 中有一个多边形(棋盘游戏的十六进制),例如; public class GridHex : IGridShape { ..... public IList
我创建了一个简单的 DirectX 应用程序来渲染一个顶点场。顶点呈现如下(如果从顶部查看): |\|\|\|\| |\|\|\|\| 每个三角形都是这样渲染的: 1 |\ 2 3 这应该意味着多边形
我的代码的某些部分here : var stage = new Kinetic.Stage({ container: "canvas", width: 300,
我正在尝试从 map 数据构造导航网格物体。步骤之一涉及将二进制图像(其中0表示占用空间,1表示自由空间)转换成平面直线图。 我正在尝试找到一种可靠的方法。我目前的想法是使用Canny边缘检测器,然后
我的任务是编写 MATLAB 代码来生成一个由 4 部分组成的 Logo ,如屏幕截图所示。左上角应为黑色,右下角应为白色。另一个程序应随机选择两种颜色。 我采取了以下方法: clear all cl
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
如何向 google.maps.Rectangle 和 google.maps.Polygon 添加标题? title 属性在 RectangleOptions 中不可用.我试过了,但没用(对于 go
我有一个表,用于将表上的段存储为多边形。然后我想获取所有被另一个多边形接触的线段,例如正方形或圆形。图片上:http://img.acianetmedia.com/GJ3 我将灰色小框表示为段和 bi
我正在我的网站上使用 CSS 来制作形状。它在 chrome 中运行良好,但在 mozilla、internet explorer 中打开时,它无法运行。 有人知道怎么解决吗? 这是 fiddle h
我使用 DrawingManager 在 Google map 上绘制圆形和多边形。我尝试使用下面的代码删除圆形/多边形。 selectedShape.setMap(null); 这里selected
我看到了很多如何检测碰撞的教程,但没有看到如何解决它。我正在制作一个自上而下的游戏,玩家具有圆形碰撞形状,而墙壁是各种多边形。 我正在使用 slick2d。我应该做的是,如果玩家与角落碰撞,我会按法线
我对 tkinter 比较陌生,我正在制作一个只使用正方形的游戏。我正在抄写的书只显示三角形。这是代码: # The tkinter launcher (Already complete) from
我在 OpenCV/Python 中工作,我遇到了这个问题。我已经使用 cv2.minAreaRect() 来获取围绕一组点的边界框。是否有任何其他函数/通用算法可以给我内接多边形(点集)的最大矩形?
如果给定一组线段 S ,我们能否设计一种算法来测试集合 S 中的线段是否可以形成多边形,我对它们是否相交多边形不感兴趣,我只想知道我可以测试什么标准, 任何建议 最佳答案 构建一个图形数据结构,其中节
如何从多个地理位置(经度、纬度值)创建多边形地理围栏。此外,如何在 Android 上跟踪用户进入此地理围栏区域或从该区域退出。 最佳答案 地理围栏只是一组形成多边形的纬度/经度点。获得纬度/经度点列
我想要一个 complex image like this在我的申请中。我想让用户点击复杂的多边形(在这种情况下是有边界的国家/地区)并突出显示他们点击的多边形。我有我需要用于该状态的图像。 我怎样才
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我想在 python tkinter 中移动对象,特别是多边形。问题出在 is_click 函数中。我似乎无法弄清楚如何确定我是否单击了该对象。代码还没有 100% 完成,移动仍然需要完成,但我现在需
我有一个大多边形,我想找到与该多边形相交的要素,但由于多边形太大,我遇到超时异常。 我试图研究 JTS 方法,但不知道如何使用它。 final List coordinates = List.of(n
我是一名优秀的程序员,十分优秀!