Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

一,矩阵Matrix的数学原理

矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对矩阵进行分解和简化可以简化计算过程。对于一些特殊矩阵,如稀疏矩阵和准对角矩阵,有特定的快速运算算法。

在Matrix Matrix中,矩阵的数学原理同样适用。Matrix提供了缩放、平移、旋转和错切等操作,这些操作对应于特定的矩阵变换。例如,缩放操作对应于矩阵的元素乘以一个标量,平移操作对应于矩阵的元素加上一个偏移量,旋转操作则通过矩阵的置换和缩放来实现。

Matrix的数学原理在实际应用中非常重要。在图形处理、计算机视觉、机器学习等领域,都需要使用到矩阵运算和变换。掌握矩阵的数学原理有助于更好地理解和应用这些技术。

二,3x3矩阵的计算方法:

3x3矩阵的计算方法包括加法、减法、数乘和矩阵乘法。

加法是将两个3x3矩阵对应位置的元素相加,得到一个新的3x3矩阵。减法是将两个3x3矩阵对应位置的元素相减,得到一个新的3x3矩阵。数乘是将一个标量和一个3x3矩阵相乘,得到一个新的3x3矩阵。矩阵乘法是将两个3x3矩阵按照一定的规则相乘,得到一个新的3x3矩阵。

在进行矩阵乘法时,需要按照一定的规则进行计算,即左边矩阵的第一行的元素分别与右边矩阵的第一列的元素相乘,然后求和得到相乘矩阵的第一行的第一个元素。同样地,左边矩阵的第一行的元素分别与右边矩阵的第二列的元素相乘,求和得到相乘矩阵的第一行的第二个元素,以此类推。

另外,还有三阶矩阵乘法的公式:D=a11a22a33+a12a23a31+a13a21a32-a13a22a31-a12a21a33- a11a23a32。这个公式可以帮助我们快速地计算出两个3x3矩阵的乘积。

需要注意的是,在进行矩阵运算时,需要遵循一定的运算规则,如先进行括号内的运算,然后进行加、减、乘等运算,最后进行除法运算。同时,要注意矩阵的维数,即行数和列数,只有当两个矩阵的维数相同时才能进行矩阵运算。

三,四种变换的具体情形

1,平移变换
假定有一个点的坐标是 P_(x_0,y_0)将其移动到P_(x,y) ,再假定在x轴和y轴方向移动的大小分别为:
△x = x - x_0
△y = y - y_0
如下图所示:
在这里插入图片描述不难知道:
x = x_0 + △x
y = y_0 + △y
如果用矩阵来表示的话,就可以写成:
在这里插入图片描述
2,旋转变换
围绕坐标原点旋转

假定有一个点的坐标是 P_(x_0,y_0) ,相对坐标原点顺时针旋转 theta后的情形,同时假定P点离坐标原点的距离为r,如下图:
在这里插入图片描述那么,
在这里插入图片描述如果用矩阵,就可以表示为:
在这里插入图片描述3,缩放变换
理论上而言,一个点是不存在什么缩放变换的,但考虑到所有图像都是由点组成,因此,如果图像在x轴和y轴方向分别放大k1和k2倍的话,那么图像中的所有点的x坐标和y坐标均会分别放大k1和k2倍,即:
x = k_1 x x_0
y = k_2 x y_0

用矩阵表示就是:
在这里插入图片描述4,对称变换(翻转)
事实上,我们还可以利用Matrix,进行对称变换。所谓对称变换,就是经过变化后的图像和原图像是关于某个对称轴是对称的。比如,某点 经过对称变换后得到,
如果对称轴是x轴,那么,
x = x_0
y = -y_0
用矩阵表示就是:
在这里插入图片描述
如果对称轴是y轴,那么,
x = -x_0
y =y_0

用矩阵表示就是:
在这里插入图片描述如果对称轴是y = x,如图:
在这里插入图片描述四,基本方法解析

1,构造函数

public Matrix()
public Matrix(Matrix src)

构造函数有两个,第一个是直接创建一个单位矩阵,第二个是根据提供的矩阵创建一个新的矩阵(采用deep copy)

单位矩阵如下:
在这里插入图片描述2,平移效果

public void setTranslate(float dx, float dy)

设置平移效果,参数分别是x,y上的平移量。
效果图如下:
在这里插入图片描述
在Android中,Matrix 类用于执行各种2D图形变换,包括平移。以下是一个示例代码,展示如何使用 Matrix 实现平移:

Matrix matrix = new Matrix();  
matrix.setTranslate(dx, dy); // dx 和 dy 是平移的距离  // 假设你有一个 Bitmap 对象  
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);  // 应用 Matrix 到 Bitmap 上  
Bitmap transformedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  // 现在,transformedBitmap 是平移后的图像

在上述代码中,setTranslate 方法用于设置平移的距离。dx 和 dy 参数分别表示在x轴和y轴方向上的平移距离。然后,通过 createBitmap 方法将应用了平移变换的 Matrix 应用到一个 Bitmap 上,得到平移后的图像。

2,缩放效果

public void setScale(float sx, float sy, float px, float py)
public void setScale(float sx, float sy)

两个方法都是设置缩放到matrix中,sx,sy代表了缩放的倍数,px,py代表缩放的中心。这里跟上面比较类似不做讲解了。

3,旋转效果

public void setRotate(float degrees, float px, float py)
public void setRotate(float degrees)

看一个示例,我们把图像旋转90度,那么90度对应的sin和cos分别是1和0。
在这里插入图片描述
4,对称翻转
在Android中,Matrix类并没有直接提供实现对称的接口。对称变换通常涉及到更复杂的几何变换,包括旋转、平移和缩放等。Matrix类提供了一些基本的方法来实现这些变换,但如果你需要实现更复杂的对称变换,可能需要自定义实现或者使用其他图形处理库。

如果你需要实现对称变换,一种可能的解决方案是先对图像进行对称变换,然后再使用Matrix类的方法进行平移、旋转和缩放等操作。这需要一些几何知识来计算对称变换的矩阵,然后将其应用到图像上。

以下是一个示例代码,展示了如何使用Matrix类实现对称变换:

// 假设你有一个 Bitmap 对象  
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);  // 定义对称变换的矩阵  
Matrix matrix = new Matrix();  
matrix.setScale(-1, 1); // 对称变换的矩阵  
matrix.postTranslate(bitmap.getWidth(), 0); // 执行对称变换后的平移  // 应用 Matrix 到 Bitmap 上  
Bitmap symmetricBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  // 现在,symmetricBitmap 是对称变换后的图像

在上述代码中,我们首先创建一个 Matrix 对象,并使用 setScale 方法设置对称变换的矩阵。这里我们使用了 -1 和 1 作为缩放因子,分别表示在x轴和y轴方向上的对称变换。然后,我们使用 postTranslate 方法将对称变换后的图像平移到正确的位置。最后,通过 createBitmap 方法将应用了对称变换和平移的 Matrix 应用到一个 Bitmap 上,得到对称变换后的图像。

需要注意的是,这只是一个简单的示例代码,实际的对称变换可能需要更复杂的矩阵计算。如果你需要实现更复杂的对称变换,可能需要使用更高级的图形处理库或者自定义实现。

五,高级方法解析

上面的基本方法中,有关于变换的set方法都可以带来不同的效果,但是每个set都会把上个效果清除掉,例如依次调用了setScale,setTranslate,那么最终只有setTranslate会起作用,那么如何才和将两种效果复合呢。Matrix给我们提供了很多方法。但是主要都是2类:

preXXXX:以pre开头,例如preTranslate
postXXXX:以post开头,例如postScale

他们分别代表了前乘,和后乘。看一段代码:

Matrix matrix = new Matrix();
matrix.setTranslate(100, 1000);
matrix.preScale(0.5f, 0.5f);

这里matrix前乘了一个scale矩阵,换算成数学式如下:
在这里插入图片描述
从上面可以看出,最终得出的matrix既包含了缩放信息也有平移信息。
后乘自然就是matrix在后面,而缩放矩阵在前面,由于矩阵前后乘并不等价,也就导致了他们的效果不同。我们来看看后乘的结果:
在这里插入图片描述可以看到,结果跟上面不同,并且这也不是我们想要的结果,这里缩放没有更改,但是平移被减半了,换句话说,平移的距离也被缩放了。所以需要注意前后乘法的关系。

matrix除了上面的方法外,还有一些其他的方法。

public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf)

在Android中,setRectToRect 是 Matrix 类的一个方法,用于将一个矩形(源矩形)转换到另一个矩形(目标矩形)。这个方法通常用于图形变换,例如在图像处理或绘图操作中。

该方法接受四个参数:

src:源矩形的左上角坐标(x, y)和其宽度和高度(width, height)。
dst:目标矩形的左上角坐标(x, y)和其宽度和高度(width, height)。
filterMin:缩放过滤模式的最小值。
filterMag:缩放过滤模式的最大值。

这个方法的作用是将源矩形转换为目标矩形,通过矩阵变换实现平移、缩放、旋转等操作。它可以根据需要选择不同的缩放过滤模式,以控制图像的平滑度和质量。

以下是一个示例代码,展示了如何使用 setRectToRect 方法进行图像变换:

Matrix matrix = new Matrix();  
// 设置源矩形的坐标和大小  
float srcLeft = 0;  
float srcTop = 0;  
float srcWidth = 100;  
float srcHeight = 100;  
// 设置目标矩形的坐标和大小  
float dstLeft = 50;  
float dstTop = 50;  
float dstWidth = 200;  
float dstHeight = 200;  
// 设置缩放过滤模式(使用线性插值)  
matrix.setRectToRect(new RectF(srcLeft, srcTop, srcLeft + srcWidth, srcTop + srcHeight),  new RectF(dstLeft, dstTop, dstLeft + dstWidth, dstTop + dstHeight),  Matrix.ScaleToFit.CENTER, Matrix.ScaleToFit.CENTER);  
// 应用矩阵到 Bitmap 上进行变换  
Bitmap transformedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

在上述示例中,我们首先创建了一个 Matrix 对象,并使用 setRectToRect 方法将源矩形转换为目标矩形。这里,我们使用了线性插值作为缩放过滤模式,使图像在变换过程中保持平滑。然后,我们将应用了矩阵变换的 Matrix 应用到一个 Bitmap 上,得到变换后的图像。

ScaleToFit 有如下四个值:

FILL: 可能会变换矩形的长宽比,保证变换和目标矩阵长宽一致。
START:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。左上对齐。
CENTER: 保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。
END:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。右下对齐。

你的鼓励将是我创作的最大动力,求大神打赏!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/413910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…

【并发编程】synchornized原理

📝个人主页:五敷有你 🔥系列专栏:并发编程 ⛺️稳重求进,晒太阳 目录 Monitor概念 Java对象头 普通对象 数组对象 Monitor(锁) Monitor结构如下: 注意: 原理之synchornized 轻量…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下: 打开 PyCharm,并选择 "Create New Project"(新建项目)。在弹出的窗口中,选择左侧的 "Python" 选项,然后选择右侧的 "Flask" 项目…

移动云助力智慧交通数智化升级

智慧交通是在整个交通运输领域充分利用物联网、空间感知、云计算、移动互联网等新一代信息技术,综合运用交通科学、系统方法、人工智能、知识挖掘等理论与工具,以全面感知、深度融合、主动服务、科学决策为目标,推动交通运输更安全、更高效、…

AbstractHttpMessageConverter + easyexcell优雅下载附件

介绍 AbstractHttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的抽象基类。它用于处理来自 HTTP 请求的消息,并将其转换为特定的 Java 对象,或者将 Java 对象转换为 HTTP 响应消息。 这个抽象类允许开发人员创建自定义的 HTTP 消息转换器,以便在 Spring MVC…

HTML 表单

文章目录 表单什么是表单GET和POST两种提交方式有什么不同?表单元素表单项外文本单行文本输入框单行文本密码框单选框复选框下拉列表框上传文件隐藏域填写邮箱填写电话填写数字填写日期进度条多行文本输入框提交按钮取消按钮 用户注册案例 表单 什么是表单 form:表单元素 此…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下,众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时,遭遇了一个令人困扰的技术问题:系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要,它的缺失直接导致了《泰坦…

Producer源码解读

Producer源码解读 在 Kafka 中, 我们把产生消息的一方称为 Producer 即 生产者, 它是 Kafka 的核心组件之一, 也是消息的来源所在。它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某个分区上。那么这些生产者产生的消息是怎么传到 Kafka 服务端的呢&a…

基于小波多普勒变换的回波信号检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1小波变换基础 4.2 多普勒效应与多普勒变换 4.3 小波多普勒变换 4.4 回波信号检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %回波…

跨Android、iOS、鸿蒙多平台框架ArkUI-X

ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。 一…

visual studio的安装及scanf报错的解决

visual studio是一款很不错的c语言编译器 下载地址:官网 点击后跳转到以下界面 下滑后点击下载Vasual Sutdio,选择社区版即可 选择位置存放下载文件后,即可开始安装 安装时会稍微等一小会儿。然后会弹出这个窗口,我们选择安装位…

windows安装mysql5.7

看了如何学习mysql后,就开始本地安装mysql,开始学习了。 1.官网下载 官网地址: https://dev.mysql.com/downloads/mysql/ 选择5.7版本 点击 “No thanks, just start my download”开始下载 下载64位的压缩包版 解压下载好的.zip文件&#xf…