Я работаю над проектом редактора изображений, где вы можете поворачивать и обрезать изображение.
Проблема, с которой я сейчас сталкиваюсь, - это когда я повернул изображение, я бы хотел, чтобы он мог перетащить ящик обрезки где-нибудь внутри границ повернутого изображения. До сих пор я рассматривал алгоритмы Ling-Barsky и Cohen-Sutherland для отсечения линий и разделял теорему о оси, но я изо всех сил пытаюсь понять, как я могу реализовать их для своего варианта использования.
Может кто-то указать мне верное направление? Я лаяю неправильное дерево?
Используйте комментарий Алена. Чтобы проверить настойчивость углов, достаточно встретить вращение изображения, чтобы его края были выровнены по оси. Тогда у вас есть легкая проблема с осью-выравниванием.
(Я не хочу, чтобы вы действительно вращали изображение, просто геометрию.)
Если движение, которое пользователь пытается сделать, это [dx, dy], тогда рассмотрим отрезки линии от углов выбора до тех точек, которые были переведены на [dx, dy] (желтые строки в примере ниже). Эти линии могут пересекаться с вращающимися границами изображения (зеленые линии) в определенных точках (красные точки). Если пересечений нет, то движение является законным. Если есть одно или несколько перекрестков, они расскажут вам, до какой точки движение было законным; точка пересечения, которая ближе всего к ее исходному положению (проверка горизонтального или вертикального расстояния достаточно, чтобы установить это), определяет максимальное движение (нижний правый угол в примере). Затем вы можете ограничить перевод этой точкой.
В зависимости от того, какой квадрант находится в направлении движения (вверху справа в примере), вы можете пропустить проверку одного из углов (нижний левый угол в примере); другие углы всегда будут сталкиваться с границами в первую очередь.
Вы также можете пропустить проверку двух границ (внизу и слева в примере), сравнив направление движения с углом поворота изображения.
Поэтому вам нужно проверить пересечения трех сегментов линии с двумя линейными сегментами. Для кода пересечения сегмента линии см., Например, этот вопрос.
Если пользователь перетаскивает только одну сторону и расширяет прямоугольник, а не перемещает его, вам нужно только проверить два движущихся угла.