не позволяйте одному квадрату выходить за пределы второго квадрата - PullRequest
2 голосов
/ 12 июня 2019

у меня 2 квадрата и все позиции для повернутого квадрата

sq1.x1y1
sq1.x2y2
sq1.x3y3
sq1.x4y4 
sq1.maxX
sq1.minX
sq1.maxY
sq1.minY
sq1.rotatedAngl
sq1.cX
sq1.cY

все позиции до вращения

и для второго квадрата

sq2.x1y1
sq2.x2y2
sq2.x3y3
sq2.x4y4 
sq2.maxX
sq2.minX
sq2.maxY
sq2.minY
sq2.cX
sq2.cY

Это мои квадраты

enter image description here

После перетаскивания квадрата 1 и остановки

enter image description here

после поворота на 45 градусов

enter image description here

А после перетаскивания квадрат 1

enter image description here

я хочу прекратить перетаскивание, когда углы квадрата 2 пересекаются с квадратом 1

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Квадрат можно определить как тройной {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

1 голос
/ 12 июня 2019

У вас есть координаты каждого угла. Вы можете определить сегменты по двум углам. Вы можете получить расстояние от одного угла (квадрат для перетаскивания) до сегментов другого квадрата.

Формула расстояния и ее знак могут быть здесь

Вы можете сравнить знаки для двух параллельных сторон квадрата. Если оба «слева» или оба «справа», то точка находится за пределами квадрата.

...