使用线性代数比几何容易得多!此外,您不需要使用正弦、余弦等函数,因此可以将每个数字存储为有理分数,并在需要时获得精确的数值结果。
您需要的是将旧的 (x,y) 坐标映射到新的 (x',y') 坐标。您可以使用矩阵来完成。您需要找到 2×4 投影矩阵 P,使 P 乘以旧坐标等于新坐标。我们假设您正在将直线映射到直线(而不是例如将直线映射到抛物线)。由于您有投影(平行线不保持平行)和平移(滑动),您还需要一个因子 (xy) 和 (1)。表示成矩阵形式:
[x ]
[a b c d]*[y ] = [x']
[e f g h] [x*y] [y']
[1 ]
你需要了解 a 到 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(水平、垂直)。 第一次肯定会出错。