使用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. 让.NetCore程序跑在任何有docker的地方

    一.分别在Windows/Mac/Centos上安装Docker Windows上下载地址:https://d […]...

  2. 多线程编程学习笔记——使用并发集合(二)

    接上文 多线程编程学习笔记——使用并发集合(一)   二、   使用ConcurrentQueue来实现异步处 […]...

  3. c# 生成下部带文字的二维码

    话不多说,直接上代码 public class QrCodeUtil { /*qrcode 使用方法 1.引用 […]...

  4. C#数据结构-赫夫曼树

    什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树 […]...

  5. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲 […]...

  6. C++11部分特性

    初识C++的时候,觉得会个STL就差不多了,后来发现了C++11这个东西,以及C++14,C++17QAQ,看 […]...

  7. C# 布局 Anchor&Dock

    编写c#的时候,希望里面的空间能够随窗口的改变自动调整大小。就需要用到Anchor和Dock属性。 编写c#的 […]...

  8. C++程序设计基础(3)条件语句和循环语句

    注:读《程序员面试笔记》笔记总结 1.知识点 1.1条件语句 (1)if……;(2)if……else……;(3 […]...

随机推荐

  1. mysql基础命令

    1、创建/编辑数据库 # 创建字符集为utf8的数据库testuser mysql> create da […]...

  2. python程序开机自启动

    windows下设置 因为服务器是windows环境 担心黑窗口不小心被关闭  因此想要让python程序在后 […]...

  3. 3D网页小实验-基于多线程和精灵动画实现RTS式单位行为

    一、实验目的: 1、在上一篇的“RTS式单位控制”的基础上添加逻辑线程,为每个单位实现ai计算; 2、用精灵动 […]...

  4. 一键部署mysql 无修改直接cp 执行 100% 有效

    一键部署mysql     无修改直接cp  执行 100% 有效      将安装包拖至/opt目录下,编一 […]...

  5. SqlServer数据库优化之添加主键和自增长

    今天需要给有500万条数据的表添加主键和自增长列,其中最大的难度在于如何UPDATE这500万多条数据,开始吧 […]...

  6. Tomcat服务器集群与负载均衡实现

    一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终 […]...

  7. Studio 5000之结构化文本(ST)编程

    在前面,写过关于Studio 5000 FBD编程方法,这次介绍的是结构化文本编程,即常说的ST(Struct […]...

  8. 拉格朗日对偶性(Lagrange duality)

    目录 拉格朗日对偶性(Lagrange duality) 1. 从原始问题到对偶问题 2. 弱对偶与强对偶 3 […]...

展开目录

目录导航