Повернуть прямоугольник внутри прямоугольника - PullRequest
0 голосов
/ 12 ноября 2018

Моя задача - повернуть прямоугольник внутри другого прямоугольника.

Описание проблемы:

Внутренний прямоугольник, назовем его B, не может пересекать внешний прямоугольник,давайте назовем это A. Но если A повернут дальше, чтобы он снова мог занять юридическую позицию, его следует повернуть к нему.Таким образом, требуемое поведение - остановить вращение до того, как оно пересечет границу, и продолжить вращение, как только B снова получит юридическую позицию.B вращается с помощью мыши, и, возможно, не каждый дополнительный градус рассчитывается дополнительно.Таким образом, событие мыши может указывать на 20 градусов, а на следующей итерации - на 40 градусов.

Мой подход состоит в том, чтобы решить эту проблему путем расчета и работы с поворотами.Я получил альфа-вращение, указывающее на мышь.Бета - это поворот от альфы к правому верхнему углу B. Я рассчитал ограничивающую сферу (оранжевую) и точки ее столкновения с A (вверху слева, вверху справа, справа вверху, справа внизу (слева и ботом не упоминаются, чтобы не усложнять)проблема).

Сделано вычислений:

При таком подходе мне удалось вычислить, когда мне нужно остановиться, но только для верхней и правой сторон отдельно. Например:Вращение по часовой стрелке -> Обрезка сверху

If (B.leftTopCornerRotation < TopLeft ||  B.leftTopCornerRotation > TopRight) {
    Alpha = TopLeft - Beta;
} else if (B.leftBotCornerRotation < TopLeft ||  B. leftBotCornerRotation > TopRight) {
    Alpha = Topleft + Beta  + PI; // + PI rotates the value by 180 degree
} else if (B.rightBotCornerRotation < TopLeft ||  B. rightBotCornerRotation > TopRight) {
    Alpha = TopLeft - Beta + PI;
} else if (B.rightTopCornerRotation < TopLeft ||  B. rightTopCornerRotation > TopRight) {
    Alpha = TopLeft + Beta;
}

Моя первая проблема заключается в том, что если B выходит за границы более чем на одну строку (например, сверху и справа), то возникают ситуации, в которых я корректирую вращение, так чтодля правой стороны нет превышения, чем правильно, что на верхней стороне нет превышения, но со второй коррекцией я вызываю превышение на правой стороне. Это приведет к бесконечному циклу.

MyВторая проблема заключается в том, что этот подход выглядит очень сложным.

Мой вопрос будет, если есть какой-то лучший / рабочий подход к калибровкеСоставьте правильное вращение для B по часовой стрелке и против часовой стрелки, чтобы оно не выходило за границы.В лучшем случае это будет выглядеть так, будто он просто останавливается на углу.

1 Ответ

0 голосов
/ 12 ноября 2018

Для каждого угла B найдите угловые интервалы, когда он лежит вне каждого края A (бесконечный край для простоты).

Затем выполните объединение этих 16 интервалов (большинство из них должны быть пустыми, если B невелико) и исключите результирующий интервал, установленный из полного диапазона окружности.

...