二维坐标基本变换(平移、旋转、缩放、镜像、阵列)
诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。
首先,定义点类如下:
//定义点类,亦可表示向量
class vec2
{
public:float v[2];//v[0]为横坐标,v[1]为纵坐标vec2(){}~vec2(){}//构造函数,例vec2 p(0,0);表示构造p点坐标为(0,0)vec2(const float &x, const float &y){v[0] = x; v[1] = y;}//重载[],如vec2 p ;p[0]即表示x坐标值,p[1]表示y坐标值float &operator[] (int i) { return v[i]; }const float &operator[] (int i) const { return v[i]; }
};
注意,为了形式统一,变换矩阵应统一为3*3阶,同理,对于三维坐标变换矩阵应是4*4阶。关于矩阵的表示,实际上便是一个二维数组,其相关运算可以直接利用Eigen库,具体如何配置就不在此赘述。矩阵如何定义可参考如下,注意矩阵的初始化不应该是全部元素为0,而是对角元素为1,其余为0,即单位矩阵E.
class Matrix2D
{
public:double A[3][3];
} ;
对于一点表示为1*3的矩阵,则一个点集S = {}表示为一个n*3的矩阵:
我们将这个矩阵称为原始矩阵,而后续的变换表示为这个矩阵乘以一个或多个矩阵,实则为两个二维数组的乘法与加法。
一、平移
对于平移我们需要知道一个平移的方向和平移的距离,因此可以通过一个向量表示这2个量,即
,平移矩阵表示为:
平移后的坐标即为*。
二、旋转
对于旋转我们需要的是一个弧度θ,则旋转矩阵表示为:
若只是乘上,表示的是坐标绕原点旋转,如果输入旋转中心,应将目标点的坐标平移到旋转中心,完成旋转后再平移回来,变换矩阵应为**,即:
旋转后的坐标即为 * **。
三、缩放
对于缩放我们需要的是一个缩放系数t,则缩放矩阵表示为:
若输入缩放中心,同旋转,应先平移到缩放中心缩放完再平移回来。变换矩阵应为,即:
缩放后的坐标即为 *。
四、镜像
对于镜像,我们需要输入对称轴,即输入2个点p,q,但实际上计算需要的是对称轴的法向量,通过p-q获得对称轴方向向量,再求其垂直向量即可。镜像矩阵表示为:
另外就是需要一个表示对称轴位置的点,在输入的对称轴2点中随便取一点即可,表示为 ,变换矩阵为,即:
镜像后的坐标即为*。
五、阵列
阵列可以分为环形阵列和方向阵列。
1.环形阵列
和旋转变换类似,输入阵列中心,阵列数量,通过不断旋转获得阵列对象,变换矩阵表示为:
环形阵列的每个对象坐标为*。
2.方向阵列
和平移变换类似,输入2个点,表示阵列的方向,实际上我们需要的是单位方向向量、阵列对象之间的间距和阵列数量,其单位方向向量由输入的2个点相减后除以模长获得,变换矩阵表示为:
方向阵列的每个对象坐标为*。
六、实现效果
在MFC中实现的效果如下图所示:
二维坐标基本变换(平移、旋转、缩放、镜像、阵列)相关推荐
- python函数图像平移_旋转、缩放和平移二维坐标?
下面是一个关于矩阵的解决方案(这对于这种计算是有意义的,最后,二维坐标是一列的矩阵!)我是说 缩放非常简单,只需将矩阵的每个元素乘以缩放因子即可:scaled = copy.deepcopy(orig ...
- 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
[实验内容] 以矩阵运算为数学基础,采用旋转.平移.缩放.对称等基本几何变换,对一简单的二维图形做变换. [实验步骤] 1. 编写二维图形基本变换(包括旋转.平移.缩放.对称)的通用子程序: 2. 以 ...
- WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放
一 平移 (1)平移直接体现在代码当中 在二维当中,平移相当于就是改变x,y的位置. function setRectangle(gl, x, y, width, height) {var x1 = ...
- 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)
二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...
- java坐标移动题目case_用java怎样编写一个二维坐标平移程序
展开全部 java编写二维坐标平移程序,主要是e69da5e887aa62616964757a686964616f31333337626231通过类继承Point2D,使用里面的方法来平移,如下代码: ...
- 二维坐标和三维坐标相互转换
原理参考世界坐标系.相机坐标系.图像坐标系.像素坐标系之间的转换 我的需求是将二维点转换成三维点,旋转三维点,再转换为二维点,此处的旋转跟相机成像的旋转矩阵又没有关系. 假定像素坐标为(u,v),处理 ...
- java 课后习题 二维坐标距离 三角形判断等
知识点: 1.三角形的判断公式 两边之和大于第三边 2.二维坐标两点距离公式 根号[(x1-x2)平方+(y1-y2)平方] 3.JAVA Math.pow(变量,指数); 的运用 4.JAVA Ma ...
- 【JAVA 第四章 流程控制语句】课后习题 二维坐标距离 三角形判断等
知识点: 1.三角形的判断公式 两边之和大于第三边 2.二维坐标两点距离公式 根号[(x1-x2)平方+(y1-y2)平方] 3.JAVA Math.pow(变量,指数); 的运用 4.JAVA Ma ...
- 长宽相等的矩阵(二维数组)逆时针旋转90度
将长宽相等的矩阵(二维数组)逆时针旋转90度,例如,有如下一个二维数组 00 10 20 30 40 50 60 01 11 21 31 41 51 61 02 12 22 32 42 52 62 0 ...
最新文章
- MXNet学习:试用卷积-训练CIFAR-10数据集
- Javascript 判断网页横竖屏
- k8s pod健康检查(存活、就绪检查):livenessProbe策略配置示例
- codeforces 1045 D. Interstellar battle
- 反向链接推进技巧: 有技巧的“跟风”策略
- jieba库分词词频统计
- 结构化编程:不确定迭代循环控制do while
- 2021-2025年中国抽屉加热器行业市场供需与战略研究报告
- python复制文件夹不阻塞_11.python并发入门(part14阻塞I/O与非阻塞I/O,以及引入I/O多路复用)...
- d3d11 indirect lighting
- axure 8 表格合并_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
- 2022 年顶级网络安全专家最爱用的10大工具
- appfuse_AppFuse 3.0
- Java Socket框架Apache MINA:实现Socket服务器端
- 大屏布局css,前端大屏项目的屏幕适配方案
- css 好看滚动条样式大全,CSS 个性化滚动条样式
- 经历过CMMI后的体会和总结,为什么别人的时间总是比你的值钱
- 绿色花灯【热门主题】
- 大型API网关(六)—— 监控和预警
- SSM框架+WebSocket实现网页聊天(Spring+SpringMVC+MyBatis+WebSocket)