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

junjunjun123 2018-05-15 原文

使用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

 

posted on 2018-05-15 15:05 我有点帅哦 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为junjunjun123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/junjunjun123/p/9011952.html

使用C++实现图形的旋转、缩放、平移的更多相关文章

  1. C# 导出 Excel 数字列出现‘0’的解决办法

    在DataGird的中某一列全是数字并且长度大于15的字符,在导出excel时数字列第15-18位全部为0。 […]...

  2. C# ManualResetEvent用法

          ManualResetEvent表示线程同步事件,可以对所有进行等待的线程进行统一管理(收到信号时 […]...

  3. C# ArrayList的用法

    System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变 […]...

  4. C# Math.Round()的银行家算法

    Math.Round四舍五入,遇到5需要舍去的情况只有一种,即5是需要保留精度后的最后一位有效数且前一位数是偶 […]...

  5. 序综合设计实践 :QT实现计算器

    程序综合设计实践 :用QT实现简易计算器及贷款计算 1,项目概述   该项目目标是设计开发一个支持连续计算的包 […]...

  6. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景     在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均 […]...

  7. 3.多用户博客网站开发实战之创建数据库

    文章 Article(文章表) 字段名称 数据类型 其他特殊 是否可空 默认值 字段描述 Id bigint […]...

  8. C#中的函数式编程:序言(一)

    学了那么久的函数式编程语言,一直想写一些相关的文章。经过一段时间的考虑,我决定开这个坑。 至于为什么选择C#, […]...

随机推荐

  1. Spring Boot RestApi 测试教程 Mock 的使用

    测试 Spring Boot Web 的时候,我们需要用到 MockMvc,即系统伪造一个 mvc 环境。本章 […]...

  2. 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控

    随着互联网的发展,尤其是移动互联网,基于H5、微信的应用越来越多,企业也更多地想基于Chrome、网页、H5、 […]...

  3. 个人网站一步一步搭建——(6)留言板页面前端

    慢慢做 慢慢发现问题、手机端的字体大小、网页的背景颜色都要统一。。得改。。。。 PC端   移动端...

  4. 【xingorg1-ui】基于vue3.0从0-1搭建组件库(一)环境配置与目录规划

    【xingorg1-ui】基于vue3.0从0-1搭建组件库 npm地址 github源码 开篇-环境配置 环 […]...

  5. Mac 启动按键 – 我不是牛人

        Mac 的开机时,按住一些按键可以发生奇妙的事情,有些按键我们使用的比较多,比如“Option”键,但 […]...

  6. Redmine迁移至华为软件开发云-项目管理 – 老鱼大哥

    Redmine迁移至华为软件开发云-项目管理 2017-07-25 09:24  老鱼大哥  阅读(427)  […]...

  7. normalize()错误 – Vulkan

    normalize()错误 struct vecto3 { float x; float y; float z […]...

  8. 天使投资(AI),风险投资(VC),私募基金(PE);A轮,B轮,C轮,D轮,E轮,F轮融资之间的区别

    总体可以一张图来区分这几种资金方和融资方式。     天使投资(AI):天使投资所投的项目都是正处于非常早期阶 […]...

展开目录

目录导航