Как правило, вам понадобится Теорема о разделяющей оси , чтобы определить, сталкиваются ли два повернутых прямоугольника. Но есть простой способ узнать, сталкиваются ли прямоугольники перед использованием 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!");
}
}
}
Очевидно, что вы можете изменить это для соответствия вашей реализации - я надеюсь, что это направит вас в правильном направлении.