2014-01-13 4 views
0

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

Я пробовал использовать android.graphics.Rect, я надеялся, что метод intersect вернет true, давая мне прямоугольник с шириной 0, но точки пересекающегося края. Я использую andEngine, а также попытался использовать метод collideswith org.andengine.entity.primitive.Rectangle, но возвращает true, даже если прямоугольник имеет только одну угловую вершину.

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

Вот изображение, чтобы продемонстрировать, что я хочу. Если я нажимаю на прямоугольнику 1, то я хочу вернуться прямоугольниками 2,3 и 4, но не 5.

1 http://i43.tinypic.com/2d0bfxg.png «Карта»

+0

Как насчет того, чтобы рассматривать их как график и удерживать список аджанс? Вместо списка краев вы говорите о ... – gtgaxiola

+0

Делают прямоугольники двигаются или вращаются? Попробуйте точечный продукт оси x и y. –

+0

Нет, прямоугольники не перемещаются и не вращаются. Я не знаком с точками или списками Adjacency, но я пойду и посмотрю их. –

ответ

1

Похоже, вам нужен новый класс, чтобы сделать это. Я бы взял координаты каждого угла прямоугольников. Затем, когда вы выбираете прямоугольник, вы можете получить тех, кто прилегает к нему, найдя их по одной стороне за раз. Начиная с вершины для примера, вы проверяете, какие другие прямоугольники имеют углы на одной высоте. Из этого списка вы проверяете, какие из них существуют, по крайней мере, в одной точке между двумя верхними углами. Итак, если верхний левый 0,3, а верхний правый - 4,3, то вы должны искать список углов при y = 3. Из этого списка вы найдете все углы, где 0 < = x < = 4, и все, что подходит, будет смежным. Затем вы делаете то же самое для каждой дополнительной стороны. Это должен быть легкий класс, но я не собираюсь писать какой-либо код, поскольку я ничего не знаю о том, как вы храните свои данные или как вы ссылаетесь на это в своем коде. Если вам нужна помощь, напишите комментарий.

1

Напишите функцию, чтобы найти, какие прямоугольники обмениваются ребрами с прямоугольниками во всех рассмотренных прямоугольниках.

Затем сопоставьте эти прямоугольники, которые разделяют грани друг к другу. Список Adjacency - это просто способ представления графика в коде.

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

Кроме того, я не уверен, что вы конечный гол здесь, но here's a question Я ответил, что имеет дело с прямоугольным сжатием.

List<Rectangle> allRectangles; 

public boolean shareAnEdge(Rectangle r1, Rectangle r2){ 
    int y1 = r1.y + r1.height; 
    int y2 = r2.y+r2.height; 
    int x1 = r1.x+r1.width; 
    int x2 = r2.x+r2.width; 
    boolean topShared = (y1 == r2.y && r2.x == r1.x); 
    boolean bottomShared = (y2 == r2.y && r2.x==r1.x); 
    boolean rightShared = (x1 == r2.x && r2.y==r1.y); 
    boolean leftShared = (x2 == r1.x && r2.y==r1.y); 
    if (topShared || bottomShared || rightShared || leftShared) { 
     return true; 
    } 
    return false; 
} 

public List<Rectangle> findSharedEdgesFor(Rectangle input){ 
    List<Rectangle> output = new List<Rectangle>(); 
    for(Rectangle r : allRectangles){ 
     if(r!=input && shareAnEdge(r, input)){ 
      output.add(r); 
     } 
    } 
} 

public AdjacencyList createGraph(List<Rectangle> rectangles){ 
    AdjacencyList graph = new AdjacencyList(); 
    for(Rectangle r : rectangles){ 
     List<Rectangle> sharedEdges = findSharedEdgesFor(r); 
     for(Rectangle shared : sharedEdges){ 
      graph.createEdgeBetween(r, shared); 
     } 
    } 
} 
+0

Спасибо за код, я должен быть в состоянии изменить это, чтобы справиться с случаями, когда они разделяют только часть края - скажем, если прямоугольник 4 расширен дальше в ось X, тогда я все равно хочу его включить. Моя конечная цель - иметь карту форм и знать любые соседние формы. Вся указанная выше карта может быть заключена в другой прямоугольник, который в этом случае будет граничить с всеми прямоугольниками. –

+0

Понял, но какова конечная цель этого? Вы строите навигационную сетку? Вы используете это для удаления визуальных элементов? Уменьшение объемов столкновений? –

+1

Нет, это игра-головоломка, в которой вам нужно покрасить карту, используя минимальное количество цветов. Никакие две граничащие области не могут иметь один и тот же цвет. –

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