Android - Обнаружение коллизий растровых изображений (повернуто) - PullRequest
1 голос
/ 24 ноября 2011

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

Но как мне узнать, сталкиваются ли два из этих объектов друг с другом? Также было бы достаточно, если бы вы могли сказать мне, как работает обнаружение столкновений между 2 повернутыми прямоугольниками ... Или, возможно, вы могли бы опубликовать некоторый код ...

Спасибо, если вы можете помочь (и спасибо, что вы потратили время на чтение этого или обдумывание ответа)

1 Ответ

1 голос
/ 24 ноября 2011

Как правило, вам понадобится Теорема о разделяющей оси , чтобы определить, сталкиваются ли два повернутых прямоугольника. Но есть простой способ узнать, сталкиваются ли прямоугольники перед использованием SAT, чтобы вам не приходилось выполнять ненужную обработку. Вы можете выполнить проверку ограничивающего круга, чтобы доказать, что прямоугольники не пересекаются, доказав, что их ограничивающие круги не пересекаются.

Ограничительный круг прямоугольника имеет общий центр и диаметр, равный длине любой диагонали прямоугольника. По существу, если окружности не пересекаются, то и прямоугольники не могут пересекаться.

Я не уверен, как вы выполняете свои вращения, но если вы используете объекты типа Shape / Area, вы можете использовать AffineTransform для выполнения вращения, а затем использовать intersects() в области каждого повернутого объекта, чтобы проверьте, не сталкиваются ли они, это избавит вас от самостоятельной реализации. Рассмотрим следующий пример:

import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;

public class Main {

    public static void main(String args[]) {
        //Create rectangle 
        Rectangle rect = new Rectangle(10, 10, 10, 10);
        //Create transformation object
        AffineTransform af = new AffineTransform();
        //Rotate the rectangle by 45 degrees
        af.rotate(Math.PI/4, rect.x, rect.y); 

        Rectangle rect2 = new Rectangle(20, 20, 20, 20);
        AffineTransform bf = new AffineTransform();
        bf.rotate(Math.PI/4, rect2.x, rect2.y);

        //Create Area objects based off of the Rectangle objects
        Area areaA = new Area(rect);
        //Set the Area object to be the same as the Rectangle object
        areaA = areaA.createTransformedArea(af);
        Area areaB = new Area(rect2);
        areaB = areaB.createTransformedArea(bf);

        //Check if the objects collide by using their Area equivalent
        if (areaA.intersects(areaB.getBounds())) {
            System.out.println("Collision!");
        }
    }
}

Очевидно, что вы можете изменить это для соответствия вашей реализации - я надеюсь, что это направит вас в правильном направлении.

...