Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android中的Matrix(矩阵)

Android中的Matrix(矩阵)

作者头像
全栈程序员站长
发布于 2022-09-06 07:51:17
发布于 2022-09-06 07:51:17
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

写在前面

看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看。

  1. 如何计算矩阵乘法
  2. android matrix 最全方法详解与进阶(完整篇)
  3. Android Matrix 最全方法详解与进阶
  4. 1-4 Canvas 对绘制的辅助 clipXXX() 和 Matrix

矩阵的乘法

比如有矩阵A和矩阵B,他们分别为:

可以看到A为2行3列的矩阵,B为3行2列的矩阵,矩阵乘法符合下面的规则:

  1. 只有A的列数和B的行数相等,A和B才可以做乘法
  2. A*B的结果C是2行2列的矩阵,行数等于A的行数,列数等于B的列数
  3. 结果矩阵C的第一行第一列数值为A的第一行和B的第一列中的数字分别相乘后再相加。其他行列结果依次类推
  4. 矩阵的乘法不满足交换律,即A*B != B*A
  5. 矩阵的乘法满足结合律M‘ = T*(M*R) = T*M*R = (T*M)*R

详细信息可以看这里:如何计算矩阵乘法

Android中常用的四种矩阵变换

Android中使用3×3的矩阵进行图形的变换,它看起来大概是下面这样:

在Android中,使用一个3×1的矩阵来表示一个点:

x,y分别代表x,y轴上的坐标,而1代表屏幕在z轴上的坐标为默认的。如果将1变大,那么屏幕会拉远, 图形会变小。

平移(Translate)

图例:

错切(Skew)

水平错切

图例:

垂直错切

图例:

复合错切

图例:

旋转(Rotate)

图例:

缩放(Scale)

图例:

Matrix的组合

应用矩阵进行图形变换的主要原因,是因为矩阵是可以通过矩阵的乘法进行组合使用的,如果想对canvas绘制的bitmap时,先平移T(dx, dy),再旋转R(θ),最后缩放S(k1,k2),就可以将三个变换矩阵相乘,M‘ = ABC,再对canvas应用M’矩阵即可。

Matrix的坐标系

矩阵的操作可以看作是以坐标原点为原点的坐标系在三维空间中做的变换,不同于canvas的屏幕坐标系坐标系,矩阵Matrix的坐标系为左手坐标系:

这个坐标系对应的每个轴的旋转方向(从原点看出去,每个轴的旋转方向都是逆时针):

Matrix的操作可以看做是对上面左手坐标系的变换

因为Matrix变换后是对每个canvas的点起作用,其实也可以看做对这个三维坐标系起了作用,canvas绘制的是三维坐标系上的图像对canvas二位坐标系的投影。

所以,可以用自己的左手模拟进行平移旋转等操作,更加直观的想象变换后的效果。

Matrix的左乘和右乘

在Android中,有关矩阵的操作都是成对的,比如preTranslate(float dx, float dy)和postTranslate(float dx, float dy),通过看api的介绍,如果原矩阵为M,那么pre表示的是左乘,post表示右乘:

preTranslate : M’ = M * T(dx, dy) // 左乘 postTranslate: M’ = T(dx, dy) * M // 右乘

因为矩阵的变换是顺序执行的,所以在平时最常用的应该是pre左乘,所有的变换操作都依次执行,比如canvas常用的translate等变换方法其实就是左乘。右乘其实就是在所有操作之前增加一步操作,合理的运用右乘可以方便代码的编写。

比如:图形变换是以左边原点为原点的,所以旋转、缩放等功能应用到canvas.drawBitmap()方法时(因为bitmap常从原点往右下方画),图像表现出来的结果就特别奇怪,需要将canvas的坐标系移动到图像的中心点再操作然后再把坐标系移回去,那么如果只用pre左乘的话,代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix matrix = new Matrix();
matrix.preTranslate(pivotX,pivotY);
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.preTranslate(-pivotX, -pivotY);

如果合理使用右乘,那么代码就成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix matrix = new Matrix();
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.postTranslate(pivotX,pivotY);
matrix.preTranslate(-pivotX, -pivotY);

减少了postTranslate和preTranslate之间的距离。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155028.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android自定义系列——11.Matrix入门
Matrix是一个矩阵,主要功能是坐标映射,数值转换。 它看起来大概是下面这样:
老马的编程之旅
2022/06/22
8280
Android自定义系列——11.Matrix入门
Android Matrix详解
在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中的Matrix是一个3 x 3的矩阵,其内容如下:
青蛙要fly
2024/01/27
2200
Android Matrix详解
Android自定义View【实战教程】6⃣️---深入理解 Android 中的 Matrix
兄弟们,重新拿起手中的线性代数课本,重拾一下矩阵吧。 记住一条原则:小事问老婆,大事问Google!!! 矩阵的基础知识
先知先觉
2019/01/21
8470
android matrix 最全方法详解与进阶(完整篇)
这里我们会详细讲解matrix的各个方法,以及它的用法。matrix叫做矩阵,在前面讲解 ColorFilter 的文章中,我们讲解了ColorMatrix,他是一个4*5的矩阵。而这里,我们讲解的Matrix不是用于处理颜色的,而是处理图形的。他是一个3*3的矩阵。
青蛙要fly
2024/01/28
1.4K0
android matrix 最全方法详解与进阶(完整篇)
Android自定义系列——13.Matrix Camera
我们的手机屏幕是一个2D的平面,所以也没办法直接显示3D的信息,因此我们看到的所有3D效果都是3D在2D平面的投影而已,而本文中的Camera主要作用就是这个,将3D信息转换为2D平面上的投影,实际上这个类更像是一个操作Matrix的工具类,使用Camera和Matrix可以在不使用OpenGL的情况下制作出简单的3D效果。
老马的编程之旅
2022/06/22
1.4K0
Android自定义系列——13.Matrix Camera
Android 图形处理 —— Matrix 原理剖析
Android 图形库中的 android.graphics.Matrix 是一个 3×3 的 float 矩阵,其主要作用是坐标变换
GeeJoe
2021/12/09
1.5K0
Android 图形处理 —— Matrix 原理剖析
Android--Camera基本用法
在我们处理canvas平移,缩放等矩阵matrix变换中,除了自己手动操作矩阵matrix外,安卓系统还提供了一个工具类--Camera,用于3D变换计算,生成一个Matrix矩阵实例用于画布上面绘制
aruba
2020/07/02
8010
变换(Transform)(1)-向量、矩阵、坐标系与基本变换
如果要将右侧坐标系变为左侧那种,我们只需要做一些旋转操作,将右侧坐标系顺时针旋转180度,再将整个坐标系水平翻转即可。我们可以通过一定的旋转操作将两个坐标系重合,那么我们就称它们具有相同的旋向性(handedness)。
Zero Two
2024/07/21
5450
【笔记】《计算机图形学》(6)——变换矩阵
这系列的笔记来自著名的图形学虎书《Fundamentals of Computer Graphics》,这里我为了保证与最新的技术接轨看的是英文第五版,而没有选择第二版的中文翻译版本。不过在记笔记时多少也会参考一下中文版本
ZifengHuang
2020/07/29
3.2K0
【笔记】《计算机图形学》(6)——变换矩阵
Android Matrix
在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中的Matrix是一个3 x 3的矩阵,其内容如下:
用户3004328
2018/09/06
1.7K0
Android Matrix
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29523119/article/details/78577246
用户1148525
2019/06/11
1.5K0
《Unity Shader入门精要》笔记(三)
x轴、y轴朝向并非固定,如:OpenGL和DirectX使用了不同的二维笛卡尔坐标系。
代码咖啡
2021/12/06
1.4K0
《Unity Shader入门精要》笔记(三)
OpenGL ES 2.0 (iOS)[02]:修复三角形的显示
从图可以看出,这三个数据形成的其实是一个等边直角三角形,而在 iOS 模拟器中通过 OpenGL ES 绘制出来的是直角三角形,所以是有问题的,三角形被拉伸了。
半纸渊
2018/09/04
1.3K0
OpenGL ES 2.0 (iOS)[02]:修复三角形的显示
3D图形学线代基础
如标题所言都是些很基础但是异常重要的数学知识,如果不能彻底掌握它们,在 3D 的世界中你将寸步难行。
NewbieYoung
2020/10/26
2.2K0
3D图形学线代基础
变换(Transform)(2)-坐标空间变换
在刚接触图形学,看games101课程时,观察变换与投影变换就给我了相当大的麻烦,同样的(l, r, t, b, n, f)参数,网上每个人给出来的矩阵形式有所不同,让我永远分不清。随着学习资源的丰富以及自己稍微有了些成长,这篇文章终于解决了这个困惑。
Zero Two
2024/08/24
2350
双目视觉理论篇
上图中右下角的黑点是真实世界的一个点,最左边的灰色部分是一张数字照片,称为像平面,单位为毫米(mm)。青色的格子则是像平面中一个一个的像素。我们现在需要知道的是黑色的点是如何变成像平面中的一个像素。中间的灰色部分是相机的透镜,而该部分中心点称为光心。真实世界的黑点会经过各种模型(线性或非线性的),通过光心在像平面中得到一个像素点。
算法之名
2024/04/21
1410
双目视觉理论篇
2D坐标系中绘制旋转的椭圆-坐标变换
https://www.cnblogs.com/zhoug2020/p/7864898.html
周星星9527
2021/03/19
1.2K0
2D坐标系中绘制旋转的椭圆-坐标变换
模型视图矩阵和投影矩阵_马尔可夫模型
机器视觉就是用机器代替人眼和人脑来做测量和判断。机器视觉系统工作的基本过程是获取目标的图像后,对图像进行识别、特征提取、分类、数学运算等分析操作,并根据图像的分析计算结果,来对相应的系统进行控制或决策的过程。 在很多机器视觉应用中,都需要用到机器视觉测量,即根据目标的图像,来得到目标在实际空间中的物理位置,典型的如抓取机械手、行走机器人、SLAM等。 要根据图像中的目标像素位置,得到目标的物理空间位置,我们需要首先有一个图像像素坐标与物理空间坐标的映射关系,也就是将光学成像过程抽象为一个数学公式,这种能够表达空间位置如何映射到图像像素位置的数学公式,就是所说的机器视觉成像模型,本文即讨论这种模型的机理。
全栈程序员站长
2022/11/09
5610
模型视图矩阵和投影矩阵_马尔可夫模型
Android开发之漫漫长途 XVII——动画
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/21
4430
Android开发之漫漫长途 XVII——动画
模型矩阵、视图矩阵、投影矩阵
模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(Canonical View Volnme)中。总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化到世界坐标系中,视图矩阵将顶点从世界坐标系转化到视图坐标系下,而投影矩阵将顶点从视图坐标系转化到规范立方体中。
全栈程序员站长
2022/08/27
2.4K0
推荐阅读
相关推荐
Android自定义系列——11.Matrix入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档