Использование линейной алгебры намного проще, чем вся эта геометрия! Кроме того, вам не нужно использовать синус, косинус и т. Д., Поэтому вы можете хранить каждое число как рациональную дробь и получать точный числовой результат, если он вам нужен.
То, что вы хотите, - это отображение ваших старых (x, y) координат в ваши новые (x ', y') координаты. Вы можете сделать это с помощью матриц. Вам нужно найти матрицу проекции P 2 на 4, чтобы P умножить на старые координаты новые координаты. Предположим, что вы отображаете линии на линии (например, не прямые на параболы). Поскольку у вас есть проекция (параллельные линии не остаются параллельными) и перевод (скольжение), вам также необходимо использовать множители (xy) и (1). Нарисовано в виде матриц:
[x ]
[a b c d]*[y ] = [x']
[e f g h] [x*y] [y']
[1 ]
Вам нужно знать сквозную h, поэтому решите следующие уравнения:
a*x_0 + b*y_0 + c*x_0*y_0 + d = i_0
a*x_1 + b*y_1 + c*x_1*y_1 + d = i_1
a*x_2 + b*y_2 + c*x_2*y_2 + d = i_2
a*x_3 + b*y_3 + c*x_3*y_3 + d = i_3
e*x_0 + f*y_0 + g*x_0*y_0 + h = j_0
e*x_1 + f*y_1 + g*x_1*y_1 + h = j_1
e*x_2 + f*y_2 + g*x_2*y_2 + h = j_2
e*x_3 + f*y_3 + g*x_3*y_3 + h = j_3
Опять же, вы можете использовать линейную алгебру:
[x_0 y_0 x_0*y_0 1] [a e] [i_0 j_0]
[x_1 y_1 x_1*y_1 1] * [b f] = [i_1 j_1]
[x_2 y_2 x_2*y_2 1] [c g] [i_2 j_2]
[x_3 y_3 x_3*y_3 1] [d h] [i_3 j_3]
Подключите свои углы для x_n, y_n, i_n, j_n. (Углы работают лучше всего, потому что они далеко друг от друга, чтобы уменьшить ошибку, если вы выбираете точки, скажем, из-за пользовательских щелчков.) Возьмите обратную матрицу 4x4 и умножьте ее на правую часть уравнения. Транспонирование этой матрицы - P. Вы должны быть в состоянии найти функции для вычисления обратной матрицы и умножения в режиме онлайн.
Где вы, вероятно, будете иметь ошибки:
- При вычислении не забудьте проверить деление на ноль. Это признак того, что ваша матрица не обратима. Это может произойти, если вы попытаетесь отобразить одну (x, y) координату в двух разных точках.
- Если вы пишете свою собственную матричную математику, помните, что в матрицах обычно указываются строка, столбец (вертикальный, горизонтальный), а экранная графика - x, y (горизонтальный, вертикальный). Вы непременно сделаете что-то не так в первый раз.