Моя задача - повернуть прямоугольник внутри другого прямоугольника.
Описание проблемы:
Внутренний прямоугольник, назовем его 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 по часовой стрелке и против часовой стрелки, чтобы оно не выходило за границы.В лучшем случае это будет выглядеть так, будто он просто останавливается на углу.