• 使用C++实现图形的旋转、缩放、平移


    编译环境:VS2017

    编译框架:MFC

    实验内容:显示一个三角形,并将其绕中心进行旋转、缩放以及平移等操作

    实验步骤:

      1.打开VS2017,并创建MFC项目具体方法参见:http://www.cnblogs.com/junjunjun123/p/8811150.html

      2.在新建的执行程序中加入如下代码

    void CMFCApplication10View::Ontransfor()
    {
        // TODO: 在此添加命令处理程序代码
        CDC *pDC = GetDC();
        double Q = 15;                    //顺时针旋转角度(单位为度)
        double c = 0.5, d = 0.5;            //x,y缩放倍数
        double e = 100, f = 0;            //x,y平移量
        //转换为弧度 
        Q = Q / 180 * 3.1415926;
        //初始三角形
        CPoint pts[3];
        //几何变换后的三角形
        CPoint zf[3];
        //存放临时的初始坐标
        double TJ[3];
        //存放临时的转换后的坐标
        double SX[3];
        //给坐标点赋初始值 
        pts[0].x = 100, pts[0].y = 50;
        pts[1].x = 300, pts[1].y = 50;
        pts[2].x = 200, pts[2].y = 100;
        //计算三角形的中心坐标(a,b)
        double a = (pts[0].x + pts[1].x + pts[2].x) / 3;
        double b = (pts[0].y + pts[1].y + pts[2].y) / 3;
        //复合变换矩阵,将设置的几何变换参数综合到此变换矩阵中
        double R[3][3] =
        { { c*cos(Q)  ,          d*sin(Q) ,                0 },
        { -c * sin(Q) ,          d*cos(Q),                 0 },
        { c*(-a*cos(Q)+b*sin(Q))+a+e,d*(-a*sin(Q)-b*cos(Q))+b+f,1 }}; 
        for (int i = 0; i<3; i++)        //i表示三角形的第i个点
        {
    
            TJ[0] = pts[i].x;
            TJ[1] = pts[i].y;
            TJ[2] = 1;
            for (int j = 0; j<3; j++)        //j表示矩阵的第j列
            {
                SX[j] = TJ[0] * R[0][j] + TJ[1] * R[1][j] + TJ[2] * R[2][j];
            }
            zf[i].x = SX[0];
            zf[i].y = SX[1];
        }
        //输出初始的图形
            pDC->Polygon(pts, 3);
        //输出集合变换后的图形
            pDC->Polygon(zf, 3);
    }

      另有在VS2017中无需加上 #include "math.h" ,其他版本可能需要加上

      3.运行结果如下:效果为三角形沿其中心缩小为其原来的1/2,再以其中心为原点顺时针旋转15度,最后向右平移100个像素点(参见代码)

      

    原创声明:此博客为作者原创,欢迎转载,转载时请指明出处,作者:我有点帅哦http://www.cnblogs.com/junjunjun123/p/9011952.html

  • 相关阅读:
    2014第2周四部署环境&买火车票
    2014第2周三Web安全学习
    2014第2周二
    2014第2周一
    2013第一周日小结
    2013第1周六意外加班到很晚
    2014第一周五开发问题记URL传参乱码等
    XML文档形式&JAVA抽象类和接口的区别&拦截器过滤器区别
    通过WriteProcessMemory改写进程的内存
    【java】Windows7 下设置环境变量
  • 原文地址:https://www.cnblogs.com/junjunjun123/p/9011952.html
Copyright © 2020-2023  润新知