алгоритм - обнаружение попадания прямоугольника внутри повернутого прямоугольника

1

Изображение 174551

Я работаю над проектом редактора изображений, где вы можете поворачивать и обрезать изображение.

Проблема, с которой я сейчас сталкиваюсь, - это когда я повернул изображение, я бы хотел, чтобы он мог перетащить ящик обрезки где-нибудь внутри границ повернутого изображения. До сих пор я рассматривал алгоритмы Ling-Barsky и Cohen-Sutherland для отсечения линий и разделял теорему о оси, но я изо всех сил пытаюсь понять, как я могу реализовать их для своего варианта использования.

Может кто-то указать мне верное направление? Я лаяю неправильное дерево?

  • 2
    Проверьте, все ли четыре угла внутреннего прямоугольника находятся внутри внешнего прямоугольника.
  • 0
    Наивный метод заключается в проверке каждого сегмента линии меньшего прямоугольника, чтобы увидеть, пересекает ли он какой-либо сегмент большего прямоугольника. У вас есть точки для повернутого прямоугольника (при условии, что вы знаете угол поворота), так что это всего лишь 16 тестов пересечения линий. Не оптимально, но это начало. И если вы можете сделать некоторые предположения (например, левая сторона прямоугольника выбора не может пересекать правую сторону повернутого прямоугольника), вы можете уменьшить количество тестов, которые вы должны сделать.
Теги:
algorithm
geometry
coordinate
collision-detection

2 ответа

2
Лучший ответ

Используйте комментарий Алена. Чтобы проверить настойчивость углов, достаточно встретить вращение изображения, чтобы его края были выровнены по оси. Тогда у вас есть легкая проблема с осью-выравниванием.

Изображение 174551

(Я не хочу, чтобы вы действительно вращали изображение, просто геометрию.)

  • 0
    спасибо, это гениально :) чуть более интенсивную операцию встречного поворота можно выполнить при нажатии мыши, затем при перемещении мыши я могу просто проверить, все ли 4 угла находятся в поле. здорово!
  • 0
    Интенсивный? Что вы имеете в виду ? Это должно занять менее 0,1 микросекунды.
Показать ещё 2 комментария
0

Если движение, которое пользователь пытается сделать, это [dx, dy], тогда рассмотрим отрезки линии от углов выбора до тех точек, которые были переведены на [dx, dy] (желтые строки в примере ниже). Эти линии могут пересекаться с вращающимися границами изображения (зеленые линии) в определенных точках (красные точки). Если пересечений нет, то движение является законным. Если есть одно или несколько перекрестков, они расскажут вам, до какой точки движение было законным; точка пересечения, которая ближе всего к ее исходному положению (проверка горизонтального или вертикального расстояния достаточно, чтобы установить это), определяет максимальное движение (нижний правый угол в примере). Затем вы можете ограничить перевод этой точкой.

Изображение 174551

В зависимости от того, какой квадрант находится в направлении движения (вверху справа в примере), вы можете пропустить проверку одного из углов (нижний левый угол в примере); другие углы всегда будут сталкиваться с границами в первую очередь.
Вы также можете пропустить проверку двух границ (внизу и слева в примере), сравнив направление движения с углом поворота изображения.
Поэтому вам нужно проверить пересечения трех сегментов линии с двумя линейными сегментами. Для кода пересечения сегмента линии см., Например, этот вопрос.

Если пользователь перетаскивает только одну сторону и расширяет прямоугольник, а не перемещает его, вам нужно только проверить два движущихся угла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню