诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。

首先,定义点类如下:

//定义点类,亦可表示向量
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中实现的效果如下图所示:

 

二维坐标基本变换(平移、旋转、缩放、镜像、阵列)相关推荐

  1. python函数图像平移_旋转、缩放和平移二维坐标?

    下面是一个关于矩阵的解决方案(这对于这种计算是有意义的,最后,二维坐标是一列的矩阵!)我是说 缩放非常简单,只需将矩阵的每个元素乘以缩放因子即可:scaled = copy.deepcopy(orig ...

  2. 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称

    [实验内容] 以矩阵运算为数学基础,采用旋转.平移.缩放.对称等基本几何变换,对一简单的二维图形做变换. [实验步骤] 1. 编写二维图形基本变换(包括旋转.平移.缩放.对称)的通用子程序: 2. 以 ...

  3. WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放

    一 平移 (1)平移直接体现在代码当中 在二维当中,平移相当于就是改变x,y的位置. function setRectangle(gl, x, y, width, height) {var x1 = ...

  4. 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)

    二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...

  5. java坐标移动题目case_用java怎样编写一个二维坐标平移程序

    展开全部 java编写二维坐标平移程序,主要是e69da5e887aa62616964757a686964616f31333337626231通过类继承Point2D,使用里面的方法来平移,如下代码: ...

  6. 二维坐标和三维坐标相互转换

    原理参考世界坐标系.相机坐标系.图像坐标系.像素坐标系之间的转换 我的需求是将二维点转换成三维点,旋转三维点,再转换为二维点,此处的旋转跟相机成像的旋转矩阵又没有关系. 假定像素坐标为(u,v),处理 ...

  7. java 课后习题 二维坐标距离 三角形判断等

    知识点: 1.三角形的判断公式 两边之和大于第三边 2.二维坐标两点距离公式 根号[(x1-x2)平方+(y1-y2)平方] 3.JAVA Math.pow(变量,指数); 的运用 4.JAVA Ma ...

  8. 【JAVA 第四章 流程控制语句】课后习题 二维坐标距离 三角形判断等

    知识点: 1.三角形的判断公式 两边之和大于第三边 2.二维坐标两点距离公式 根号[(x1-x2)平方+(y1-y2)平方] 3.JAVA Math.pow(变量,指数); 的运用 4.JAVA Ma ...

  9. 长宽相等的矩阵(二维数组)逆时针旋转90度

    将长宽相等的矩阵(二维数组)逆时针旋转90度,例如,有如下一个二维数组 00 10 20 30 40 50 60 01 11 21 31 41 51 61 02 12 22 32 42 52 62 0 ...

最新文章

  1. MXNet学习:试用卷积-训练CIFAR-10数据集
  2. Javascript 判断网页横竖屏
  3. k8s pod健康检查(存活、就绪检查):livenessProbe策略配置示例
  4. codeforces 1045 D. Interstellar battle
  5. 反向链接推进技巧: 有技巧的“跟风”策略
  6. jieba库分词词频统计
  7. 结构化编程:不确定迭代循环控制do while
  8. 2021-2025年中国抽屉加热器行业市场供需与战略研究报告
  9. python复制文件夹不阻塞_11.python并发入门(part14阻塞I/O与非阻塞I/O,以及引入I/O多路复用)...
  10. d3d11 indirect lighting
  11. axure 8 表格合并_多人编辑,自动汇总,领导可见所有?用 SeaTable 表格更简单
  12. 2022 年顶级网络安全专家最爱用的10大工具
  13. appfuse_AppFuse 3.0
  14. Java Socket框架Apache MINA:实现Socket服务器端
  15. 大屏布局css,前端大屏项目的屏幕适配方案
  16. css 好看滚动条样式大全,CSS 个性化滚动条样式
  17. 经历过CMMI后的体会和总结,为什么别人的时间总是比你的值钱
  18. 绿色花灯【热门主题】
  19. 大型API网关(六)—— 监控和预警
  20. SSM框架+WebSocket实现网页聊天(Spring+SpringMVC+MyBatis+WebSocket)

热门文章

  1. Python中mechanize库的简单使用说明
  2. Navicat-数据库的连接以及使用
  3. Matlab axis函数
  4. 红利源头指向shopee市场,虾 扑 软件起到哪些重要作用呢?
  5. C语言冒泡排序(起泡法)
  6. python用七巧板图片画个图_canvas练习 - 七巧板绘制
  7. 当语音遇到人工智能,走进《智能语音时代》
  8. nodeJS+mysql+连接池——连接池的创建和使用
  9. Go设置一个工作区打开多个项目
  10. exlc表格怎么换行_excel如何换行_表格怎么换行上下换行