Эта проблема
У меня есть массив java.awt.Rectangle
s. Для тех, кто не знаком с этим классом, важно знать, что они предоставляют функцию .intersects(Rectangle b)
.
Я хотел бы написать функцию, которая берет этот массив Rectangle
s и разбивает его на группы соединенных прямоугольников.
Скажем, например, что это мои прямоугольники (конструктор принимает аргументы 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 ничего не пересекает. Утомительно нарисованный ascii-арт тоже справляется со своей задачей:
┌───────┐ ╔═══╗
│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);
//...
}
Кто-нибудь может пролить свет на проблему?
List
, и только когда вы фактически создаете новый список, вам нужно указать тип (ArrayList или LinkedList или что-то еще). - person MatrixFrog   schedule 12.02.2010