http://acm.hdu.edu.cn/showproblem.php?pid=6465
线性映射( linear mapping)是从一个向量空间V到另一个向量空间W的映射且保持加法运算和数量乘法运算,而线性变换(linear transformation)是线性空间V到其自身的线性映射。
最为常用的几何变换都是线性变换,这包括旋转、缩放、切变、反射以及正投影。在二维空间中,线性变换可以用 2×2 的变换矩阵表示。
首先把三个点转换成以第一个点为起点的两个向量,然后就能得到四个方程的方程组,用来求出变换矩阵。然后把要求的点转换成以第一个点为起点的向量,用变换矩阵乘上它,再加上变换后的起点就是变换后的坐标了。解方程的方法就是同乘再相减就好了。
double ans[3][3] = {0};
double x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6;
scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4, &x5, &y5, &x6, &y6);
//change to vector
x2 = x2 - x1, y2 = y2 - y1;
x3 = x3 - x1, y3 = y3 - y1;
x5 = x5 - x4, y5 = y5 - y4;
x6 = x6 - x4, y6 = y6 - y4;
//coefficient
double c1 = x2 / x3;
y3 *= c1, x6 *= c1, y6 *= c1;
ans[1][2] = (x5 - x6) / (y2 - y3);
ans[1][1] = (x5 - ans[1][2] * y2) / x2;
ans[2][2] = (y5 - y6) / (y2 - y3);
ans[2][1] = (y5 - ans[2][2] * y2) / x2;
int q;
scanf("%d", &q);
while (q--){
double x, y, cx, cy;
scanf("%lf %lf", &x, &y);
x = x - x1, y = y - y1;
cx = ans[1][1] * x + ans[1][2] * y, cy = ans[2][1] * x + ans[2][2] * y;
cx += x4, cy += y4;
printf("%.2f %.2f\n", cx, cy);
}