个人博客: http://zhangsunyucong.top
开头
这篇博客,是参考了文章:Android Matrix,这篇文章有具体的分析过程和android实例。我只是参考和根据自己的理解写的。
在Android中,我们可以从数学的角度来看颜色和动画的变换。这里会从矩阵变换的角度来理解平移,旋转,缩放,对称的变换。
这些变换的完成实际上,是操作一个3X3的矩阵的。而这四种基本变换与操作和这个矩阵有什么样的关系呢?下面会分析。
![](https://img.haomeiwen.com/i1756262/ae6ee2fce6b3fe2a.png)
在Android中,已经为每种变换提供了pre、set和post三种操作方式。
set 用于设置Matrix中的值。
pre 是先乘,因为矩阵的乘法不满足交换律,因此先乘、后乘必须要严格区分。先乘相当于矩阵运算中的右乘。
post 是后乘,因为矩阵的乘法不满足交换律,因此先乘、后乘必须要严格区分。后乘相当于矩阵运算中的左乘。
另外,除平移变换(Translate)外,旋转变换(Rotate)、缩放变换(Scale)和错切变换(Skew)都可以围绕一个中心点来进行,如果不指定,在默认情况下是围绕(0, 0)来进行相应的变换的。
平移变换
![](https://img.haomeiwen.com/i1756262/4667923b5ce5945f.png)
假设坐标系中有A和B两个点,从A平移到B点,它们之间的关系上图所示。
在x和y轴的移动增量分别是:
![](https://img.haomeiwen.com/i1756262/0966e34e148b7cfa.png)
则易得:
![](https://img.haomeiwen.com/i1756262/1292fd19e113a3d7.png)
它的矩阵表示为:
![](https://img.haomeiwen.com/i1756262/8d6f0735334313ea.png)
旋转变换
1、围绕坐标原点旋转
![](https://img.haomeiwen.com/i1756262/2f6473044eb89e09.png)
由A点顺时针旋转一定角度到B点,如图所示。
由图易知:
![](https://img.haomeiwen.com/i1756262/065eefdd9b68dc18.png)
由上面四个式子,可得:
![](https://img.haomeiwen.com/i1756262/f872af37f451f3bb.png)
矩阵表示,得:
![](https://img.haomeiwen.com/i1756262/c70df464715410a0.png)
旋转变换
2、围绕某点旋转
假设旋转点是:
![](https://img.haomeiwen.com/i1756262/5bdcf070eb28844f.png)
顺时针旋转,结合1、上面的推导结果,可以得到矩阵:
![](https://img.haomeiwen.com/i1756262/fdb4024138dff6ae.png)
可以化为:
![](https://img.haomeiwen.com/i1756262/8bdc7682c401ac77.png)
可知,围绕某一点进行旋转变换,可以分成3个步骤,即首先将坐标原点移至该点,然后围绕新的坐标原点进行旋转变换,再然后将坐标原点移回到原先的坐标原点。
缩放变换
A点的x,y坐标分别放大a,b倍。则有一下关系:
![](https://img.haomeiwen.com/i1756262/c0411d52af6ba24d.png)
用三维矩阵表示为:
![](https://img.haomeiwen.com/i1756262/5f19590d9a5f746a.png)
对称变换
1、如果对称轴是x轴,则有:
![](https://img.haomeiwen.com/i1756262/97b404c3d3e248d3.png)
用三维矩阵表示为:
![](https://img.haomeiwen.com/i1756262/48778aaa5bba5f6f.png)
2、如果对称轴是y轴,则有:
![](https://img.haomeiwen.com/i1756262/532b74059ace8a4c.png)
用三维矩阵表示为:
![](https://img.haomeiwen.com/i1756262/67bc70cd9781fc06.png)
3、如果对称轴是y = x轴,如图
![](https://img.haomeiwen.com/i1756262/f61d34a31ea10f4b.png)
由等腰直角三角形可知:
![](https://img.haomeiwen.com/i1756262/2ad831502983eac0.png)
已知中点在对称轴上,由中点坐标公式,易得:
![](https://img.haomeiwen.com/i1756262/be2028981b505451.png)
联合两式子,2式先乘以2,再两式相加和相减,可得:
![](https://img.haomeiwen.com/i1756262/632764f46514dbb5.png)
用三维矩阵表示为:
![](https://img.haomeiwen.com/i1756262/c14cfd63cee85b6d.png)
4、如果对称轴是y = -x轴。
同理,易推导得:
![](https://img.haomeiwen.com/i1756262/5984ee5344de5e8d.png)
5、如果对称轴是y = kx时。如图
![](https://img.haomeiwen.com/i1756262/758e330035a6eb25.png)
由图易知:
![](https://img.haomeiwen.com/i1756262/bc33d3f7dfa1fd62.png)
则有:
![](https://img.haomeiwen.com/i1756262/91468dbe2a86960c.png)
由直线的斜率公式,可得:
![](https://img.haomeiwen.com/i1756262/f331b09411f8592f.png)
中点坐标在直线上,结合中点坐标公式,易得:
![](https://img.haomeiwen.com/i1756262/4186eeb0ee5cc7e1.png)
由上面两式,可求得:
![](https://img.haomeiwen.com/i1756262/004c99eb2f29f1f5.png)
用三维矩阵表示为:
![](https://img.haomeiwen.com/i1756262/966256082a63be0d.png)
k为任意实数,可以取特殊的值,验证前面对称推导的结果。k为1或者-1时,k为0时,k为无穷大时等等。
6、如果对称轴是y = kx + b时
只需要在5的基础上增加两次平移变换即可,即先将坐标原点移动到(0, b),然后做上面的关于y = kx的对称变换,再然后将坐标原点移回到原来的坐标原点即可。用矩阵表示大致是这样的:
![](https://img.haomeiwen.com/i1756262/ae16903838799c0a.png)
网友评论