Создание прямолинейного многоугольника из геометрически объединенных прямоугольников

Я искал везде, и я просто не могу понять это. Я нашел много статей о разложении прямолинейных/ортогональных многоугольников, но ничего о том, как их построить.

Я работаю с Slick2D, и у меня есть тайловая карта. Я хочу свести к минимуму количество столкновений, которые мне нужно рассчитать, создавая отдельные полигоны из любых соприкасающихся прямоугольников (т.е. комбинируя плитки рядом).

Примеры: https://www.dropbox.com/s/2kf8olw5701e1xn/rectilinear_polygon.png

Я работаю с 2D-массивом прямоугольников. Я могу пройтись и выяснить, какие из них соприкасаются и все такое, но по какой-то причине я не могу понять, почему .union() не работает (или, может быть, я не совсем понимаю?). В slick2D он возвращает Shape[], а в awt, похоже, есть метод .createUnion(), который я пробовал вне своей программы, но он тоже не работал по какой-то причине. Однако я бы предпочел использовать классы slick2D по очевидным причинам совместимости.

Класс Slick2D Rectangle — http://www.slick2d.org/javadoc/org/newdawn/slick/geom/Rectangle.html

Мой метод сейчас прост. Просто используя два квадрата для тестирования, они полностью расширятся, как только я заставлю его работать, перебирая их все.

Polygon p = new Polygon();

//Calculate polygons
public void calcPoly(){
    //The blocking array is all rectangles, [0,0] and [1,0] are known to be touching.
    p = RectangleToPolygon(blocking[0][0]);
    p.union(RectangleToPolygon(blocking[1][0]));
}

И у меня также есть метод преобразования прямоугольника в многоугольник, чтобы убедиться, что я работаю с многоугольниками на всем протяжении.

public Polygon RectangleToPolygon(Rectangle rect) {
    Polygon result = new Polygon();
    result.addPoint(rect.getX(), rect.getY());
    result.addPoint(rect.getX() + rect.getWidth(), rect.getY());
    result.addPoint(rect.getX() + rect.getWidth(), rect.getY() + rect.getHeight());
    result.addPoint(rect.getX(), rect.getY() + rect.getHeight());
    return result;
}

И дело не в том, что я получаю ошибку. Дело в том, что я не получаю НИКАКИХ ИЗМЕНЕНИЙ. Нет вывода, нет ошибки, нет унификации. Казалось бы, простая вещь, но она не хочет сдвинуться с места.


person Samich    schedule 04.04.2013    source источник


Ответы (1)


Я нашел ответ на то, что я пытался выполнить (частично, я все еще получаю некоторые странные результаты, но в целом он возвращает то, что я хочу в общем смысле).

В библиотеке Slick2D есть класс Geom Utility, который также имеет метод .union(). Это возвращает массив Shape с размером 1, если объединение сработало, и 2, если фигуры остаются отдельными. Что не похоже на .union(), который находится в классах Rectangle и Shape (по какой-то странной причине....)

person Samich    schedule 11.04.2013