2013-04-04 2 views
2

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

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

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

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

Slick2D Прямоугольник класс - 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; 
} 

И это не значит, что я получаю сообщение об ошибке. Это факт, что я вообще НЕ ИЗМЕНЯЮ. Нет выхода, нет ошибки, нет объединения. Это, казалось бы, простой материал, но он не хочет двигаться.

ответ

1

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

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

Смежные вопросы