2014-01-04 5 views
1

Я работаю в подводной игре, где есть некоторые руины, сделанные из блоков. В настоящее время я проверяю на столкновение с полигоном субмарины и каждым блоком разрушения с функцией, которая возвращает вершины прямоугольника, который я сделал.Java libGDX - merge polygons

public static float[] rectangleToVertices(float x, float y, float width, 
      float height) { 
     float[] result = new float[8]; 
     result[0] = x; 
     result[1] = y; 

     result[2] = x + width; 
     result[3] = y; 

     result[4] = x + width; 
     result[5] = y + height; 
     result[6] = x; 
     result[7] = y + height; 

     return result; 
    } 

Я не думаю, что это очень эффективно, некоторые из руин получили более 10 блоков, и я не хочу, чтобы проверить 10 раз столкновения одного объекта. Есть ли способ объединить больше полигонов в один?

Эта картина может объяснить лучше: enter image description here

Там красная площадь многоугольника.

+0

Вы должны использовать массив класса Point (или собственный класс), а не массив float, где пары переменных сохраняются последовательно. http://docs.oracle.com/javase/7/docs/api/java/awt/Point.html – Ron

+0

Где фотография? Я не вижу, что – Arash

+0

@Arash, я могу, в любом случае - http://i.stack.imgur.com/7juGq.png –

ответ

1

Если я понимаю ваш вопрос, вы удаляете края shared.

Простейшим решением было бы начать с одного блока, добавив его ребра к HashSet (скажем, S1). Затем, итерации по списку блоков, проверьте, не имеет ли какой-либо из этих других разделов любое ребро из S1. Если это так, добавьте все ребра этого блока в S1. Для ребер (ов), которые уже существуют в S1, добавьте их к другому HashSet (скажем, S2), чтобы отслеживать такие ребра. В итоге вычислите S1-S2, который будет набором ребер, которые вы хотите. Используйте эти края, чтобы восстановить окончательный полигон.

Как в стороне, вы можете взглянуть на The Skyline Problem‍​​.

+0

Это будет генерировать «группу» для каждой группы соседних блоков. Вы можете повторить это для остальных блоков, пока все блоки не будут объединены. – Salil

+0

Это будет работать и группировать все блоки, пока вершины выстраиваются в линию – Ron