三角形的平移、旋转

原理很简单:

平移

将图形对象从一个位置(x, y)移到另一个位置(x’,y’)的变换。
Tx= x’ -x,Ty= y’ -y称为平移距离。
平移变换公式为:

如下图所示:

旋转

旋转是以某个参考点为圆心,将对象上的各点(x, y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x’,y’)的变换。当参考点为(0, 0)时,旋转的公式为:

如下图所示:

如果参考点不是(0, 0),而是任意一点(Xr, Yr),那么绕(Xr, Yr)点的旋转就需要
3个步骤:

其实原理大家都懂,不难。但是计算机大部分计算都是用的线性代数里面的矩阵运算,所以对于不熟悉线性代数的朋友就很困难了。对于图形学来说,矩阵计算不可避免,既直观又方便。

重点是理解矩阵的含义:矩阵其实是一种坐标系的转换

平移
起始坐标(x,y),变化后的坐标(x’,y’),x方向平移距离Tx,y方向平移距离Ty
公式如下:

那么用矩阵是怎么来表示呢?(看下图,先看着,一会用代码表示)

旋转
起始坐标(x,y),变化后的坐标(x’,y’),顺时针旋转θ
公式如下:

用矩阵表示

接着上代码:
首先是矩阵的定义及矩阵乘法,及头文件

#include "graphics.h"
#include <conio.h>
#include "windows.h"
#include <math.h>
#define pi 3.1415926;
struct matrix
{  float m[3][3];
};  //定义了矩阵结构体,用二维数组存储3×3矩阵
matrix operator*(matrix a,matrix b) //重载了乘法运算,矩阵乘法
{  matrix c={0};  for(int i=0;i<3;i++)  { for(int j=0;j<3;j++)  {   for(int k=0;k<3;k++){c.m[i][j]+=a.m[i][k]*b.m[k][j];}            }  }  return c;
}

绘制三角形:

void triangle(float a[][3],COLORREF c)
{DDA(a[0][0],a[0][1],a[1][0],a[1][1],c);DDA(a[0][0],a[0][1],a[2][0],a[2][1],c);DDA(a[1][0],a[1][1],a[2][0],a[2][1],c);
}

接着是平移和旋转的核心算法:

matrix translation(matrix a,float Tx,float Ty)//平移 矩阵a  x,y方向的平移距离
{matrix t={1,0,0,0,1,0,Tx,Ty,1};//该处矩阵对应之前那个图matrix c=a;c=c*t;return c;
}matrix rotate(matrix a,float angle,float x,float y)//旋转 矩阵a,角度,绕点(x,y)
{float radian=angle/180*pi;//角度转弧度,因为C库里面的sin、cos函数,参数为弧度matrix t={cos(radian),sin(radian),0,-sin(radian),cos(radian),0,0,0,1};//此处也同样是对应前面的图a=translation(a,-x,-y);//对应上面旋转的步骤Aa=a*t;//步骤Ba=translation(a,x,y);//步骤Creturn a;
}

然后就是主函数:

void main()
{int gd=DETECT,gm; /*图形屏幕初始化*/initgraph(&gd,&gm,"");struct matrix a={100,100,1,100,200,1,200,200,1};//矩阵a存储三角形三个顶点struct matrix c=a;triangle(c.m,LIGHTBLUE);//绘制三角形c=a;c=translation(c,200,0);//平移triangle(c.m,LIGHTBLUE);c=a;c=rotate(c,30,100,100);//旋转triangle(c.m,LIGHTBLUE);getch();closegraph();
}

DDA直线算法请看这:https://blog.csdn.net/qq_41698119/article/details/101120707

最终效果图:

三角形的平移、旋转,在VC上实现(矩阵的应用)相关推荐

  1. Java黑皮书课后题第3章:**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形。编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内

    **3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形.编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...

  2. Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

    Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...

  3. 三维空间中的几何变换-平移旋转缩放

    前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...

  4. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  5. 20P46 Premiere预设800种干扰缩放平移旋转分割拉伸全景透视扭曲炫光视频无缝转场

    20P46 Premiere预设800种干扰缩放平移旋转分割拉伸全景透视扭曲炫光视频无缝转场 模版信息: 适用软件:Premiere Pro CC 2015.3 或更高版本 使用插件:无需外置插件 分 ...

  6. 移动端/手机端 完成图片旋转 压缩 剪裁 上传

    本篇文章主要介绍移动端/手机端图片的旋转.压缩.剪裁.上传 这个功能的实现已经好了几次方案流程了,对最终的方案流程进行简述 实现功能的主要方法/思想 1.图片的选取主要是通过input实现 2.图片的 ...

  7. NTL密码算法开源库——模二整数上的矩阵(mat_GF2)

    2021SC@SDUSC 模二整数上的矩阵(mat_GF2) 矩阵运算 高斯消元 矩阵运算 具体代码 #include <NTL/matrix.h> #include <NTL/ve ...

  8. Flash3D学习计划(三)——学习VB,IB相关,理解三角形顶点顺序;在屏幕上显示2D矩形,并实现缩放,平移,旋转...

    VB:顶点缓冲 IB: 顶点索引缓冲 三角形的顶点顺序决定了三角形是顺时针还是逆时针,从而决定了三角形在背面剔除的过程中是否会被剔除掉. 相关理论知识可以在前面的文章中找到更多的说明. 实现效果 sf ...

  9. Unity矩阵平移旋转缩放Matrix4x4

    Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...

最新文章

  1. 很遗憾,我们正在逐渐丧失专注阅读的能力
  2. jsonp解决跨域问题
  3. 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
  4. 使用ffmpeg对视频进行TS切片
  5. mysql创建generator字段_springmvc+mybatsi-generator生成不了字段注释的解决方案
  6. Linux Shell 通配符、元字符、转义符使用实例介绍
  7. 微信小程序python token验证_微信小程序python 用户认证
  8. IBatis 映射文件 sql 中大于、小于等符号转义
  9. 基于Docker Compose搭建的Mysql8.0主从复制(1主3从,多主机)
  10. 危!Python 官方存储库 PyPI 再成“祸源”?
  11. mysql5.7.20新特_Mysql5.7新特性
  12. android uri转file_Android世界:ContentProvider使用
  13. 《程序员修炼之道》---- 修的是什么
  14. 【渝粤教育】国家开放大学2018年秋季 2312T旅行社经营管理 参考试题
  15. win10电脑桌面html,手把手教你美化win10电脑桌面的小技巧
  16. window xp 自动关机命令
  17. ESP32(NodeMCU-32S)简单实现路由中继/wifi中继
  18. 元数据驱动的大数据服务平台
  19. Android 在后台无法启动Activity
  20. 【搜索排序】预训练综述Pre-training Methods in Information Retrieval

热门文章

  1. HTMLCSSHTTP
  2. 虚拟机内连接MotionPro一直处于正在连接状态
  3. 有五个人坐一起,问第五个多少岁?(java)
  4. python练习题-运算符和变量练习作业题
  5. java语音、视频、其他文件下载
  6. 硬盘数据丢失能恢复吗 硬盘数据丢失怎么找回
  7. java中将类放入包中,Java 包
  8. 传输线理论(一)传输线参量
  9. C1实训-Java薪资转换(适合初学者)
  10. Unity技术手册 - 粒子基础主模块属性-下