Android中的Matrix(矩阵)

Android中的Matrix(矩阵)Android中的Matrix,了解如何使用Android的矩阵Matrix

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

写在前面

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

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

矩阵的乘法

比如有矩阵A和矩阵B,他们分别为:
v4-728px-multiply-matrices-step-2-version-3

可以看到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

c

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

Android中常用的四种矩阵变换

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

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

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

平移(Translate)

20180611214717

图例:
005xtdi2jw1f6dqiw20xoj308c0dw0su

错切(Skew)

水平错切

20180611214828

图例:
005xtdi2jw1f6cniifb0sj308c0dw3yz

垂直错切

chuizhi

图例:
005xtdi2jw1f6cnkwyksij308c0dwq3f

复合错切

fuhe

图例:
005xtdi2jw1f6cqdu6olfj308c0dwdgi

旋转(Rotate)

xuanzhuan1

图例:
005xtdi2jw1f6cpp174twj308c0dwt8s

缩放(Scale)

suofang1

图例:
005xtdi2jw1f6cnk02zy9j308c0dwwej

Matrix的组合

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

Matrix的坐标系

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

20160518114718678

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

camaer

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左乘的话,代码是这样的:

Matrix matrix = new Matrix();
matrix.preTranslate(pivotX,pivotY);
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.preTranslate(-pivotX, -pivotY);

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

Matrix matrix = new Matrix();
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.postTranslate(pivotX,pivotY);
matrix.preTranslate(-pivotX, -pivotY);

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 云计算(1)—基础知识

    云计算(1)—基础知识一、云计算概述   云计算到底是什么呢?在这个问题上,可谓众说纷纭。比如,在维基百科上的定义是“云计算是一种基于互联网的计算新方式,通过互联网上异构、自治的服务为个人和企业用户提供按需即取的计算”;著名咨询机构Gartner将云计算定义为“云计算是利用互联网技术来将庞大且可伸缩的IT能力集合起来作为服务提供给多个客户的技术”;而IBM则认为“云计算是一种新兴的IT服务交付方式,应用、数据…

  • vue引入文件(.js)「建议收藏」

    vue引入文件(.js)「建议收藏」exportdefaulta;(曝光)importafrom’../assets/js/a’(引入)

  • Java IO用法详解

    Java IO用法详解一、javaio概述1.1相关概念JavaIOJavaIO即Java输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进行IO(文件、控制台、网络),我们还要考虑具体和它们的通信方式(顺序、随机、二进制、按字符、按字、按行等等)。Java类库的设计者通过设计大量的类来攻克这些难题…

  • 启动计算机 gho文件,u盘里只有gho文件怎么重装win7系统图解

    启动计算机 gho文件,u盘里只有gho文件怎么重装win7系统图解u盘里只有gho文件怎么重装win7系统图解,windows7系统现在还是主流系统,有朋友的windows7系统出现问题了,现在u盘里只有gho文件怎么重装win7系统,这是他们遇到u盘怎么重装win7系统的问题了,那么就让小编分享一个u盘里只有gho文件怎么重装win7系统图解给大家吧。u盘里只有gho文件怎么重装win7系统步骤:工具/原料WIN7GHOST系统镜像(可以从网上下载)大于2G…

  • SQL语句中 left join 后用 on 还是 where,区别大了!

    SQL语句中 left join 后用 on 还是 where,区别大了!

  • map通过jsonobject转成实体类

    map通过jsonobject转成实体类新手

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号