如果图像围绕着某个点P(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点。
我们需要3步:
-
平移——将坐标系平移到点P(a,b);
-
旋转——以原点为中心旋转图像;
-
平移——将旋转后的图像平移回到原来的坐标原点;
相比较前面说的图像的几何变化(基本的图像几何变化),这里需要平移——旋转——平移,这种需要多种图像的几何变化就叫做图像的复合变化。
设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,它们的变化矩阵分别为T1、T2、T3…..、Tn,图像复合变化的矩阵T可以表示为:T = TnTn-1…T1。
按照上面的原则,围绕着某个点(a,b)旋转θ的变化矩阵序列是:
按照上面的公式,我们列举一个简单的例子:围绕(100,100)旋转30度(sin 30 = 0.5 ,cos 30 = 0.866)
float f[]= { 0.866F, -0.5F, 63.4F,0.5F, 0.866F,-36.6F,0.0F, 0.0F, 1.0F };
matrix = new Matrix();
matrix.setValues(f);
旋转后的图像如下:
Android为我们提供了更加简单的方法,如下:
Matrix matrix = new Matrix();
matrix.setRotate(30,100,100);
矩阵运行后的实际结果:
与我们前面通过公式获取得到的矩阵完全一样。
在这里我们提供另外一种方法,也可以达到同样的效果:
float a = 100.0F,b = 100.0F;
matrix = new Matrix();
matrix.setTranslate(a,b);
matrix.preRotate(30);
matrix.preTranslate(-a,-b);
将在后面的篇幅中为大家详细解析
通过类似的方法,我们还可以得到:相对点P(a,b)的比例[sx,sy]变化矩阵
分享到:
相关推荐
2.9 MATLAB神经网络工具箱的图形用户界面<br> 第3章 基于Simulink的神经网络控制系统<br> 3.1 基于Simulink的神经网络模块<br> 3.1.1 模块的设置<br> 3.1.2 模块的生成<br> 3.2 基于Simulink的三种典型神经网络...
<br>4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。<br>注:1、要用面向对象的方法设计代码;<br>2、一个图是一个类的实例;<br>3、类...
在这个特效中,可能运用了CSS3的`transform`属性和Canvas的矩阵变换方法,比如`save()`、`restore()`用于保存和恢复当前的变换状态,`translate()`和`rotate()`组合应用,来实现地面的旋转和烟花在3D空间中的运动...
首先,我们需要包含必要的头文件,如`<iostream>`用于输入输出,`<vector>`用于使用C++标准库的动态数组(向量)来表示矩阵。然后,我们可以定义一个函数,接收一个二维向量作为参数,返回转置后的二维向量。在这个...
在三维空间中,表示旋转的一种常见方式是使用欧拉角,它由三个旋转角度组成,通常用 yaw(偏航)、...通过对这些文件进行学习和实践,你可以深入理解旋转矩阵和欧拉角之间的转换,并掌握在C++中处理3D旋转的基本技巧。
3. 将BitMatrix转换为图像:这一步将二进制矩阵转换成可视化的图像,可以是PNG、JPEG等格式。 ```java BufferedImage image = BitmapEncoder.createImage(bitMatrix, Color.WHITE, Color.BLACK); ImageIO.write...
<artifactId>core</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.1</version> </dependency> ``...
2. **基本标签**:了解`<html>`、`<head>`、`<title>`、`<meta>`、`<style>`、`<body>`、`<canvas>`等标签的基本用法及含义。 ### 二、CSS样式设置 文档中的CSS代码负责页面的样式布局,包括去除默认的内边距和...
<artifactId>core</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.1</version> </dependency> ``...
矩阵在计算机科学中是一种重要的数据结构,特别是在图像处理、线性代数、机器学习等领域有着广泛的应用。本次课程设计的目标是实现矩阵的三种基本操作:矩阵翻转、矩阵卷动和矩阵旋转。这些操作对于理解和掌握矩阵的...
例如,可以使用`<svg>`元素结合`<path>`、`<polygon>`或`<rect>`等元素来构造3D形状,并通过`transform`属性应用变换。 VML,全称为Vector Markup Language,是在SVG之前的一种矢量图形技术,主要在Internet ...
矩阵在科学计算、图像处理、机器学习等领域中扮演着核心角色。本篇文章将详细探讨“矩阵模板类”的实现及其相关的编程知识点。 首先,矩阵模板类的设计目标是提供一种高效且灵活的方式来存储和操作矩阵。模板类允许...
它强化了网页的语义性,使得内容结构更加清晰,如`<header>`, `<nav>`, `<section>`, `<article>`等标签。此外,HTML5引入了画布元素(`<canvas>`),这为动态图形和游戏开发提供了可能。在这个3D魔方游戏中,`...
`<canvas>`元素提供了一个可编程的画布,允许通过JavaScript绘制2D和3D图形。 接下来,我们关注到"js"这个文件夹,其中的JavaScript文件负责实现动画效果。HTML5的`<canvas>`元素与JavaScript结合,可以创建动态、...
3. **矩阵相乘原理**:两个矩阵相乘的前提条件是第一个矩阵的列数必须等于第二个矩阵的行数。计算结果矩阵的每个元素时,需要将第一个矩阵的行与第二个矩阵的列对应位置上的元素相乘后求和。 4. **嵌套循环结构**:...
MathML通过使用特定的元素和属性来表示矩阵和积分,比如`<mtable>`用于构建矩阵,而`<mrow>`和`<mfrac>`等元素则用来表示行和分数。`<int>`元素通常用于表示积分,结合`<mi>`(标识符)、`<mn>`(数字)和其他元素,...
1. **旋转矩阵**:每个轴的旋转都可以用一个2x2或3x3的旋转矩阵来表示,如绕X轴的旋转矩阵RX,绕Y轴的旋转矩阵RY和绕Z轴的旋转矩阵RZ。当对一个点应用多个旋转时,需要按照特定顺序(例如Z-Y-X顺序)乘以这些矩阵。 ...
4. **矩阵乘法**:实现矩阵乘法函数,如`std::vector<std::vector<int>> multiplyMatrices(std::vector<std::vector<int>>& m1, std::vector<std::vector<int>>& m2)`。 5. **加密**:对明文进行分块,然后用加密...
根据提供的标题、描述以及部分内容,可以总结出一系列与C++编程相关的知识点,这些知识点主要集中... vector<int> wt = {1, 3, 4, 5}; vector<int> val = {1, 4, 5, 7}; int W = 7; cout << knapsack(W, wt, val, 4...
然而,在卷积运算中,卷积核(一个小型矩阵,通常是3×3或5×5)与一个较大的输入矩阵(如图像)相乘,但这里的“乘法”是在滑动窗口内进行的,而不是直接对齐的矩阵乘法。 卷积核在输入数据上的移动遵循一定的步长...