2011.10.13(2)——— android Matrix学习03
参考:
http://www.moandroid.com/?p=1805
这节主要说一下图像的复合变化
我们知道rotate(旋转),scale(缩放)和skew(倾斜)这三种操作都可以指定中心点
第一:::说一下旋转
比如说:
_matrix.postRotate(30, 100, 250);
这个意思是说围绕着(100,250)旋转30°
这种相当于先将坐标系平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点。
我们需要3步:
平移——将坐标系平移到点P(a,b);
旋转——以原点为中心旋转图像;
平移——将旋转后的图像平移回到原来的坐标原点;
1、一个概念
这种需要多种图像的几何变化就叫做图像的复合变化。
2、一个定律
设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,它们的变化矩阵分别为T1、T2、T3…..、Tn,图像复合变化的矩阵T可以表示为:T = TnTn-1…T1。
注意:最后乘的时候 是倒着乘的
//例子05 围绕某个点旋转的复合运算
private void init5() {
_bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.a)).getBitmap();
//Matrix{[1.0, 0.0, -100.0][0.0, 1.0, -250.0][0.0, 0.0, 1.0]}
//Matrix{[0.8660254, -0.5, 38.39746][0.5, 0.8660254, -266.50635][0.0, 0.0, 1.0]}
//Matrix{[0.8660254, -0.5, 138.39746][0.5, 0.8660254, -16.506348][0.0, 0.0, 1.0]}
_matrix.postTranslate(-100, -250);
Log.i(TAG, _matrix.toString());
_matrix.postRotate(30);
Log.i(TAG, _matrix.toString());
_matrix.postTranslate(100, 250);
//Matrix{[0.8660254, -0.5, 138.39746][0.5, 0.8660254, -16.506348][0.0, 0.0, 1.0]}
// _matrix.postRotate(30, 100, 250);
//可以看出来_matrix.postRotate(30, 100, 250);
//和上面的复合运算的结果是一样的
//所以说 如果图像围绕着某个点P(a,b)旋转,
//则先要将坐标系平移到该点,
//再进行旋转,
//然后将旋转后的图像平移回到原来的坐标原点。
//我们需要3步:
//1、平移——将坐标系平移到点P(a,b);
//2、旋转——以原点为中心旋转图像;
//3、平移——将旋转后的图像平移回到原来的坐标原点;
//一个概念:::
//这种需要多种图像的几何变化就叫做图像的复合变化。
//一个定律:::
//设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,
//它们的变化矩阵分别为T1、T2、T3…..、Tn,
//图像复合变化的矩阵T可以表示为:T = TnTn-1…T1。
//注意::最后乘的时候 是倒着乘的
}
通过上面的 我们证明了
_matrix.postRotate(30, 100, 250);
和
_matrix.postTranslate(-100, -250);
_matrix.postRotate(30);
_matrix.postTranslate(100, 250);
是一样的
首先 我们根据定律 来算一下:
注意:第一步平移到(100,250)得到的矩阵的a3,b3是负数 -100,-250,我想可能是把坐标(100,250)平移到原点吧 这个得注意
另外 我们可以按照我们上一节的结论 可以算出:
平移
[1.0, 0.0, -100.0][0.0, 1.0, -250.0][0.0, 0.0, 1.0]
旋转
a3 = a1*dx + a2*dy
b3 = b1*dx + b2*dy
[0.8660254, -0.5, 38.39746][0.5, 0.8660254, -266.50635][0.0, 0.0, 1.0]
平移 直接加即可
[0.8660254, -0.5, 38.39746+100][0.5, 0.8660254, -266.50635+250][0.0, 0.0, 1.0]
即:
[0.8660254, -0.5, 138.39746][0.5, 0.8660254, -16.506348][0.0, 0.0, 1.0]
第二:::缩放
//例子06 围绕某个点缩放的复合运算
private void init6() {
_bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.a)).getBitmap();
//围绕100,250缩放到原来的一半
//Matrix{[0.5, 0.0, 50.0][0.0, 0.5, 125.0][0.0, 0.0, 1.0]}
// _matrix.postScale(0.5f, 0.5f, 100, 250);
//Matrix{[1.0, 0.0, -100.0][0.0, 1.0, -250.0][0.0, 0.0, 1.0]}
//Matrix{[0.5, 0.0, -50.0][0.0, 0.5, -125.0][0.0, 0.0, 1.0]}
//Matrix{[0.5, 0.0, 50.0][0.0, 0.5, 125.0][0.0, 0.0, 1.0]}
_matrix.postTranslate(-100, -250);
Log.i(TAG, _matrix.toString());
_matrix.postScale(0.6f, 0.5f);
Log.i(TAG, _matrix.toString());
_matrix.postTranslate(100, 250);
//这个和上面的_matrix.postScale(0.5f, 0.5f, 100, 250);效果是一样的
//根据
//a1 = a1*sx a2 = a2*sx a3 = a3*sx
//b1 = b1*sy b2 = b2*sy b3 = b3*sy
//可以算出来的
}
和上面一样 先平移 在缩放 在平移
用这个
a1 = a1*sx a2 = a2*sx a3 = a3*sx
b1 = b1*sy b2 = b2*sy b3 = b3*sy
就可以算出来
不再分析了 和上面一样的
最后 结论:
旋转
相对点P(a,b)旋转Ø
_matrix.postRotate(Ø, a, b);
矩阵:
缩放
相对点P(a,b)缩放(sx,sy)
_matrix.postScale(sx,sy, a, b);
矩阵:

- 大小: 3.5 KB
分享到:
相关推荐
基于因子分析的我国A股上市...争力评价——以医药企业为例_张澳.caj
Android图像操作一例,使用Matrix.postRotate方法旋转图片,这些的图片格式是BMP,其它格式可能也能用吧,没测试,旋转BMP图片的效果如截图所示,用户单击向左或向右按钮后,图片旋转90度,旋转角度根据自己需要...
2,jdk-170.tar.gz ——————————JDK1.7deb包 3,switch_java.sh -------------------------java其它版本切换 4,check_java.sh———————————版本核对 注意:使用命令接口切换时,需要将自己配置的...
python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目...
微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+源码).zip 微信小程序——新闻客户端(截图+...
python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ读者书库.zip python项目——RCQ...
微信小程序——万年历(截图+源码).zip 微信小程序——万年历(截图+源码).zip 微信小程序——万年历(截图+源码).zip 微信小程序——万年历(截图+源码).zip 微信小程序——万年历(截图+源码).zip 微信小程序...
这篇小学语文一年级下册的反义词及量词练习主要涵盖了语言学习的基础概念,旨在帮助学生掌握汉语中的基本词汇关系和量词的正确使用。 反义词是汉语词汇中非常重要的一部分,它指的是意思相反或相对的词语。在给出的...
《.NET Framework游戏编程入门——模拟魔兽学院永远的羁绊》 在计算机编程的世界中,游戏开发是一项富有挑战性和创新性的任务。对于初学者来说,理解游戏编程的基本原理和实践技巧是迈向专业游戏开发的第一步。本文...
zxing 源码分析——DataMatrix 码部分 本文主要讲述了 zxing 源码中 DataMatrix 码部分的代码结构和解码流程。DataMatrix 码是一种二维码,zxing 是一个 Java 库,用于解析和生成各种二维码。 在 zxing 源码中,...
Android support.v7包
微信小程序——卡卡汽车 获取用户 设备信息(截图+源码).zip 微信小程序——卡卡汽车 获取用户 设备信息(截图+源码).zip 微信小程序——卡卡汽车 获取用户 设备信息(截图+源码).zip 微信小程序——卡卡汽车 ...
Android中文翻译组——Android中文API合集(4).chm
Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
【标题】与【描述】提及的是关于小学语文学习中的一个重要组成部分——歇后语。歇后语是中国传统文化中的一种独特语言现象,它结合了形象生动的比喻和巧妙的谐音,通常用于表达幽默、讽刺或者寓意深刻的观点。这些歇...
应用层包过滤防火墙 一个简单的应用层包过滤防火墙实现 Qt/SQLite/NetFilter 编译过程可使用QtCreator编译,也可使用命令行 sudo qmake && make 来编译。 运行则执行 sudo ./firewall 即可。
第4 章 Linux——App 后台应用最广泛的系统 .. 107 第5 章 Nginx——App 后台HTTP 服务的利器 . 126 第6 章 MySQL——App 后台最常用的数据库 .. 140 第7 章 Redis——App 后台高性能的缓存系统 . 160 第8 章 ...
基于IntraWeb的数据表格的多选实现 既可以单条操作,也可以多选操作。 delphi源代码。 BS开发Web网站开发,不需要安装服务器,Apache和IIS都不需要,自带企业级服务器。...————————————————
直流-直流变换器的matlab仿真模块,实现了直流降压的功能。