HDU – 6465 – 水题(线性变换)

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);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值