Квадрат можно определить как тройной {center1, side, angle}
, где center = {double center.x, double center.y}
- центр квадрата, double side
- длина стороны квадрата и, наконец, double angle
- угол, к которому квадрат вращается с горизонтального направления.
Учитывая два квадрата, вы можете представить их как
square1 = {center1, side1, angle1}
и square2 = {center2, side2, angle2}
. Идея алгоритма:
Шаг 1: поверните square2
на угол - angle1
так, чтобы его стороны были параллельны осям координат, как в первом примере. Получить новый
square1 ---> sqare10 = {center1, side1, 0}
Шаг 2: повернуть square2
также на угол - angle1
. Получить новый квадрат
square2 ---> sqare20 = {center2, side2, angle2 - angle1}
Шаг 3: ввести новый квадрат square30 = {center2, side3, 0}
, чтобы этот новый квадрат был наименьшим квадратом, содержащим sqare20
, а его стороны параллельны осям координат (четыре вершины square20
лежат по краям square30
, и они оба находятся в одном центре). Длина стороны Square30 рассчитывается как
side3 = side2 * (cos(angle2 - angle1) + sin(angle2 - angle1))
Шаг 4: Теперь вы находитесь в ситуации вашего первого примера, где пара квадратов
square10
и square30
имеют ребра, параллельные координатным осям. Проверьте относительное положение этих двух квадратов: square10
и square30
:
если square30
полностью внутри square10
, то оригинал square2
полностью внутри оригинала square1
иначе, если square30
имеет ребро, касающееся ребра square10
, то у оригинала square2
есть вершина, которая касается сторон оригинала square1