Эта проблема линейной алгебры больше, чем программирование. У вас есть линейное преобразование на простой четырехугольник. Математика проще, потому что у вас есть два ребра, параллельных краям изображения.
Прежде всего, нам нужно переопределить некоторые обозначения: например, вы использовали (x2, y2) для ссылки на обауказывает на размещенном изображении и на желаемое положение верхнего левого угла преобразованного изображения. Я упросту это, объявив преобразованные точки A = (x1, y2) и B = (x4, y3): мы растягиваем вершину трапеции по горизонтали, образуя прямоугольник.
Также обратите вниманиечто y1 = y4 и y2 = y3 с самого начала;это упрощает расчеты. Визуализируйте новые и старые изображения, наложенные внутри, с точкой вопроса Q
, координаты которой отмечены на границе. Нам нужно найти общее уравнение для преобразованной точки Q
, R
, после "растяжения".
Я также отметил медиану исходного изображения, MN
. Точки на этой линии не будут двигаться во время растяжения. Как примечание стороны, точки вдоль нижнего края 1-4
не будут двигаться. Точки на внешних краях 2-3
будут двигаться больше всего. Пусть C
будет точкой на ребре 1-2
с той же координатой y, что и Q
(и, позже, R
);пусть D
будет соответствующей точкой на MN
.
A-----2-----M-----3---B
| |
Qy CR Q D |
| |
| |
1----Rx-Qx-N----------4
Нам просто нужно пропорционально оценить величину, на которую перемещается выбранная точка. Нахождение уравнений MN
и 1-2
хорошо известно (двухточечная формула). Подставьте Qy
в каждое из этих уравнений, чтобы получить Cx
и Dx
.
Коэффициент "растяжения" при преобразовании CD
в (x1, Qy) D
представляет собой отношение их длин: (Dx-x1) / (Dx-Cx)
,Q
сместится влево на пропорцию этого коэффициента растяжения, в соответствии с расстоянием до D: (Dx-Qx) / (Dx-x1)
. Умножьте те, чтобы получить расстояние Q ходов. Вычтите эту сумму из Qx
, чтобы получить Rx
.
Да, теперь у вас есть несколько констант в конечном объединенном уравнении: x1, x2, x3, x4, y1, y2. У вас также есть переменные Qx и Qy. Это так и должно быть. Это оставляет вам общее уравнение для преобразования Qx => Rx для любой точки изображения.
Если вы планируете также растягиваться по вертикали, то же пропорции будут применяться в вертикальном направлении. Я предлагаю вам сделать один раз за раз;это сохранит модульность математики: легче проверять и отлаживать на отдельных этапах.
Это заставляет вас двигаться?
D
не будет двигаться;