如何将矩形数组分组到连接区域的“岛屿”中?
问题
我有一个数组的s。对于那些不熟悉这个类的人来说,重要的信息是它们提供了一个功能。java.awt.Rectangle
.intersects(Rectangle b)
我想写一个函数,它接受这个s数组,并将其分解成连接的矩形组。Rectangle
例如,假设这些是我的矩形(构造函数采用参数 , , ,):x
y
width
height
Rectangle[] rects = new Rectangle[]
{
new Rectangle(0, 0, 4, 2), //A
new Rectangle(1, 1, 2, 4), //B
new Rectangle(0, 4, 8, 2), //C
new Rectangle(6, 0, 2, 2) //D
}
快速绘制显示 A 与 B 相交,B 与 C 相交,D 不与任何相交。一件乏味的阿西伊艺术品也可以完成这项工作:
┌───────┐ ╔═══╗
│A╔═══╗ │ ║ D ║
└─╫───╫─┘ ╚═══╝
║ B ║
┌─╫───╫─────────┐
│ ╚═══╝ C │
└───────────────┘
因此,我的函数的输出应该是:
new Rectangle[][]{
new Rectangle[] {A,B,C},
new Rectangle[] {D}
}
失败的代码
这是我解决问题的尝试:
public List<Rectangle> getIntersections(ArrayList<Rectangle> list, Rectangle r)
{
List<Rectangle> intersections = new ArrayList<Rectangle>();
for(Rectangle rect : list)
{
if(r.intersects(rect))
{
list.remove(rect);
intersections.add(rect);
intersections.addAll(getIntersections(list, rect));
}
}
return intersections;
}
public List<List<Rectangle>> mergeIntersectingRects(Rectangle... rectArray)
{
List<Rectangle> allRects = new ArrayList<Rectangle>(rectArray);
List<List<Rectangle>> groups = new ArrayList<ArrayList<Rectangle>>();
for(Rectangle rect : allRects)
{
allRects.remove(rect);
ArrayList<Rectangle> group = getIntersections(allRects, rect);
group.add(rect);
groups.add(group);
}
return groups;
}
不幸的是,这里似乎有一个无限递归循环。我没有受过教育的猜测是Java不喜欢我这样做:
for(Rectangle rect : allRects)
{
allRects.remove(rect);
//...
}
任何人都可以对这个问题有所了解吗?