三角形的平移、旋转,在VC上实现(矩阵的应用)
三角形的平移、旋转
原理很简单:
平移
将图形对象从一个位置(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上实现(矩阵的应用)相关推荐
- Java黑皮书课后题第3章:**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形。编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内
**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形.编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...
- Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)
Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 目录 Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊) 前言 简单的平移.旋转和放缩 其他元素的一些基本使用 qm ...
- 三维空间中的几何变换-平移旋转缩放
前言 前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记. 文章内容部分引用并参考了下面的博客: http://netclass.csu.ed ...
- Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...
- 20P46 Premiere预设800种干扰缩放平移旋转分割拉伸全景透视扭曲炫光视频无缝转场
20P46 Premiere预设800种干扰缩放平移旋转分割拉伸全景透视扭曲炫光视频无缝转场 模版信息: 适用软件:Premiere Pro CC 2015.3 或更高版本 使用插件:无需外置插件 分 ...
- 移动端/手机端 完成图片旋转 压缩 剪裁 上传
本篇文章主要介绍移动端/手机端图片的旋转.压缩.剪裁.上传 这个功能的实现已经好了几次方案流程了,对最终的方案流程进行简述 实现功能的主要方法/思想 1.图片的选取主要是通过input实现 2.图片的 ...
- NTL密码算法开源库——模二整数上的矩阵(mat_GF2)
2021SC@SDUSC 模二整数上的矩阵(mat_GF2) 矩阵运算 高斯消元 矩阵运算 具体代码 #include <NTL/matrix.h> #include <NTL/ve ...
- Flash3D学习计划(三)——学习VB,IB相关,理解三角形顶点顺序;在屏幕上显示2D矩形,并实现缩放,平移,旋转...
VB:顶点缓冲 IB: 顶点索引缓冲 三角形的顶点顺序决定了三角形是顺时针还是逆时针,从而决定了三角形在背面剔除的过程中是否会被剔除掉. 相关理论知识可以在前面的文章中找到更多的说明. 实现效果 sf ...
- Unity矩阵平移旋转缩放Matrix4x4
Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...
最新文章
- 很遗憾,我们正在逐渐丧失专注阅读的能力
- jsonp解决跨域问题
- 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
- 使用ffmpeg对视频进行TS切片
- mysql创建generator字段_springmvc+mybatsi-generator生成不了字段注释的解决方案
- Linux Shell 通配符、元字符、转义符使用实例介绍
- 微信小程序python token验证_微信小程序python 用户认证
- IBatis 映射文件 sql 中大于、小于等符号转义
- 基于Docker Compose搭建的Mysql8.0主从复制(1主3从,多主机)
- 危!Python 官方存储库 PyPI 再成“祸源”?
- mysql5.7.20新特_Mysql5.7新特性
- android uri转file_Android世界:ContentProvider使用
- 《程序员修炼之道》---- 修的是什么
- 【渝粤教育】国家开放大学2018年秋季 2312T旅行社经营管理 参考试题
- win10电脑桌面html,手把手教你美化win10电脑桌面的小技巧
- window xp 自动关机命令
- ESP32(NodeMCU-32S)简单实现路由中继/wifi中继
- 元数据驱动的大数据服务平台
- Android 在后台无法启动Activity
- 【搜索排序】预训练综述Pre-training Methods in Information Retrieval