Matrix的原理

1 Matrix基础知识

首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部分。为什么分割成4部分,在后面详细说明。
Matrix的原理 - 小宝 - 竹韵琴音

 

首先给大家举个简单的例子:现设点P0x0 y0)进行平移后,移到Pxy),其中x方向的平移量为△xy方向的平移量为△y,那么,点Pxy)的坐标为:

x = x0  + △x
y = y0  + △y

采用矩阵表达上述如下:

Matrix的原理 - 小宝 - 竹韵琴音

 

上述也类似与图像的平移,通过上述矩阵我们发现,只需要修改矩阵右上角的2个元素就可以了。

我们回头看上述矩阵的划分:

Matrix的原理 - 小宝 - 竹韵琴音

 

为了验证上面的功能划分,我们举个具体的例子:现设点P0x0 y0)进行平移后,移到Pxy),其中x放大a倍,y放大b倍,

矩阵就是:Matrix的原理 - 小宝 - 竹韵琴音

 ,按照类似前面平移的方法就验证。

图像的旋转稍微复杂:现设点P0x0 y0)旋转θ角后的对有点为Px y)。通过使用向量,我们得到如下:

x0 = r  cosα
y0 = r  sin
α

x = r cos(α-θ) = x0 cosθ+ y0 sinθ
y = r sia(
α-θ) = -x0 sinθ+y0 cosθ

于是我们得到矩阵:Matrix的原理 - 小宝 - 竹韵琴音

 

如果图像围绕着某个点(a b)旋转呢?则先要将坐标平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点,在后面的篇幅中我们将详细介绍。

 

 

 

如何使用Matrix

上面从高等数学方面给大家介绍了Matrix,本篇幅我们就结合Android 中的android.graphics.Matrix来具体说明,我们上面说的图像旋转的矩阵:

Matrix的原理 - 小宝 - 竹韵琴音

 

从最简单的旋转90度的是:

Matrix的原理 - 小宝 - 竹韵琴音

 

android.graphics.Matrix中有对应旋转的函数:
Matrix matrix = new Matrix();
matrix.setRotate(90);
Test.Log(MAXTRIX_TAG,”setRotate(90):%s” , matrix.toString());

Matrix的原理 - 小宝 - 竹韵琴音

 

查看运行后的矩阵的值(通过Log输出):

Matrix的原理 - 小宝 - 竹韵琴音

 

与上面的公式基本完全一样(android.graphics.Matrix采用的是浮点数,而我们采用的整数)。

有了上面的例子,相信大家就可以亲自尝试了。通过上面的例子我们也发现,我们也可以直接来初始化矩阵,比如说要旋转30度:

Matrix的原理 - 小宝 - 竹韵琴音

 

前面给大家介绍了这么多,下面我们开始介绍图像的镜像,分为2种:水平镜像、垂直镜像。先介绍如何实现垂直镜 像,什么是垂直镜像就不详细说明。图像的垂直镜像变化也可以用矩阵变化的表示,设点P0x0 y0 )进行镜像后的对应点为P),图像的高度为fHeight,宽度为fWidth,原图像中的P0x0y0 )经过垂直镜像后的坐标变为(x0 fHeight- y0);
x = x0
y = fHeight – y0
推导出相应的矩阵是:

Matrix的原理 - 小宝 - 竹韵琴音

 

final float f[] = {1.0F,0.0F,0.0F,0.0F,-1.0F,120.0F,0.0F,0.0F,1.0F};
Matrix matrix = new Matrix();
matrix.setValues(f);

按照上述方法运行后的结果:

Matrix的原理 - 小宝 - 竹韵琴音

 

至于水平镜像采用类似的方法,大家可以自己去试试吧。

实际上,使用下面的方式也可以实现垂直镜像:
Matrix matrix = new Matrix();
matrix.setScale (1.0
-1.0);
matrix.postTraslate(0, fHeight);

这就是我们将在下面的篇幅中详细说明

图像的复合变化

第一节,我们留下一个话题:如果图像围绕着某个点P(ab)旋转,则先要将坐标系 平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点。

我们需要3步:

  1. 平移——将坐标系平移到点P(ab)
  2. 旋转——以原点为中心旋转图像;
  3. 平移——将旋转后的图像平移回到原来的坐标原点;

相比较前面说的图像的几何变化(基本的图像几何变化),这里需要平移——旋转——平移,这种需要多种图像的几何变化就叫做图像的复合变化。

设对给定的图像依次进行了基本变化F1F2F3…..Fn,它们的变化矩阵分别为T1T2T3…..Tn,图像复合变 化的矩阵T可以表示为:T = TnTn-1…T1

按照上面的原则,围绕着某个点(ab)旋转θ的变化矩阵序列是:

Matrix的原理 - 小宝 - 竹韵琴音

 

按照上面的公式,我们列举一个简单的例子:围绕(100100)旋转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);
旋转后的图像如下:

Matrix的原理 - 小宝 - 竹韵琴音

 

Android为我们提供了更加简单的方法,如下:
Matrix matrix = new Matrix();
matrix.setRotate(30
100100);
矩阵运行后的实际结果:

Matrix的原理 - 小宝 - 竹韵琴音

 
与我们前面通过公式获取得到的矩阵完全一样。

在这里我们提供另外一种方法,也可以达到同样的效果:
float a = 100.0F,b = 100.0F;
matrix = new Matrix();
matrix.setTranslate(a,b);
matrix.preRotate(30);
matrix.preTranslate(-a,-b);
将在后面的篇幅中为大家详细解析

通过类似的方法,我们还可以得到:相对点P(ab)的比例[sx,sy]变化矩阵

Matrix的原理 - 小宝 - 竹韵琴音

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值