- 浏览: 732306 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lingsuch:
Android网络连接判断与处理 -
月光照着我:
写的不错,作为笔记了
Android中LayoutInflater的使用 -
智博王锋:
好文章是要顶的!
Android中LayoutInflater的使用 -
云南白药:
...
Android中LayoutInflater的使用 -
万新one:
理解了许多。解释的不错。3Q.
Android中LayoutInflater的使用
Matrix学习——基础知识
以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明。
首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部分。为什么分割成4部分,在后面详细说明。
首先给大家举个简单的例子:现设点P0(x0, y0)进行平移后,移到P(x,y),其中x方向的平移量为△x,y方向的平移量为△y,那么,点P(x,y)的坐标为:
x = x0 + △x
y = y0 + △y
上述也类似与图像的平移,通过上述矩阵我们发现,只需要修改矩阵右上角的2个元素就可以了。
为了验证上面的功能划分,我们举个具体的例子:现设点P0(x0 ,y0)进行平移后,移到P(x,y),其中x放大a倍,y放大b倍,
图像的旋转稍微复杂:现设点P0(x0, y0)旋转θ角后的对应点为P(x, y)。通过使用向量,我们得到如下:
x0 = r cosα
y0 = r sinα
x = r cos(α+θ) = x0 cosθ - y0 sinθ
y = r sin(α+θ) = x0 sinθ + y0 cosθ
如果图像围绕着某个点(a ,b)旋转呢?则先要将坐标平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点,在后面的篇幅中我们将详细介绍。
Matrix学习——如何使用Matrix
上一篇幅 Matrix学习——基础知识,从高等数学方面给大家介绍了Matrix,本篇幅我们就结合Android 中的android.graphics.Matrix来具体说明,还记得我们前面说的图像旋转的矩阵:
从最简单的旋转90度的是:
在android.graphics.Matrix中有对应旋转的函数:
Matrix matrix = new Matrix();
matrix.setRotate(90);
Test.Log(MAXTRIX_TAG,”setRotate(90):%s” , matrix.toString());
查看运行后的矩阵的值(通过Log输出):
与上面的公式基本完全一样(android.graphics.Matrix采用的是浮点数,而我们采用的整数)。
有了上面的例子,相信大家就可以亲自尝试了。通过上面的例子我们也发现,我们也可以直接来初始化矩阵,比如说要旋转30度:
前面给大家介绍了这么多,下面我们开始介绍图像的镜像,分为2种:水平镜像、垂直镜像。先介绍如何实现垂直镜像,什么是垂直镜像就不详细说明。图像的垂直镜像变化也可以用矩阵变化的表示,设点P0(x0 ,y0 )进行镜像后的对应点为P(x ,y ),图像的高度为fHeight,宽度为fWidth,原图像中的P0(x0 ,y0 )经过垂直镜像后的坐标变为(x0 ,fHeight- y0);
x = x0
y = fHeight – y0
推导出相应的矩阵是:
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 = new Matrix();
matrix.setScale (1.0,-1.0);
matrix.postTraslate(0, fHeight);
这就是我们将在后面的篇幅中详细说明。
Matrix学习——图像的复合变化
Matrix学习——基础知识篇幅中,我们留下一个话题:如果图像围绕着某个点P(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点。
我们需要3步:
1. 平移——将坐标系平移到点P(a,b);
2. 旋转——以原点为中心旋转图像;
3. 平移——将旋转后的图像平移回到原来的坐标原点;
相比较前面说的图像的几何变化(基本的图像几何变化),这里需要平移——旋转——平移,这种需要多种图像的几何变化就叫做图像的复合变化。
设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,它们的变化矩阵分别为T1、T2、T3…..、Tn,图像复合变化的矩阵T可以表示为:T = TnTn-1…T1。
按照上面的原则,围绕着某个点(a,b)旋转θ的变化矩阵序列是:
按照上面的公式,我们列举一个简单的例子:围绕(100,100)旋转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);
旋转后的图像如下:
Android为我们提供了更加简单的方法,如下:
Matrix matrix = new Matrix();
matrix.setRotate(30,100,100);
矩阵运行后的实际结果:
与我们前面通过公式获取得到的矩阵完全一样。
在这里我们提供另外一种方法,也可以达到同样的效果:
float a = 100.0F,b = 100.0F;
matrix = new Matrix();
matrix.setTranslate(a,b);
matrix.preRotate(30);
matrix.preTranslate(-a,-b);
将在后面的篇幅中为大家详细解析
通过类似的方法,我们还可以得到:相对点P(a,b)的比例[sx,sy]变化矩阵
Matrix学习——Preconcats or Postconcats?
从最基本的高等数学开始,Matrix的基本操作包括:+、*。Matrix的乘法不满足交换律,也就是说A*B ≠B*A。
还有2种常见的矩阵:
有了上面的基础,下面我们开始进入主题。由于矩阵不满足交换律,所以用矩阵B乘以矩阵A,需要考虑是左乘(B*A),还是右乘(A*B)。在Android的android.graphics.Matrix中为我们提供了类似的方法,也就是我们本篇幅要说明的Preconcats matrix 与 Postconcats matrix。下面我们还是通过具体的例子还说明:
通过输出的信息,我们分析其运行过程如下:
看了上面的输出信息。我们得出结论:Preconcats matrix相当于右乘矩阵,Postconcats matrix相当于左乘矩阵。
上一篇幅中,我们说到:
其晕死过程的详细分析就不在这里多说了。
Matrix学习——错切变换
什么是图像的错切变换(Shear transformation)?我们还是直接看图片错切变换后是的效果:
对图像的错切变换做个总结:
x = x0 + b*y0;
y = d*x0 + y0;
这里再次给大家介绍一个需要注意的地方:
通过以上,我们发现Matrix的setXXXX()函数,在调用时调用了一次reset(),这个在复合变换时需要注意。
Matrix学习——对称变换(反射)
什么是对称变换?具体的理论就不详细说明了,图像的镜像就是对称变换中的一种。
利用上面的总结做个具体的例子,产生与直线y= – x对称的反射图形,代码片段如下:
当前矩阵输出是:
图像变换的效果如下:
附:三角函数公式
两角和公式
sin(a+b)=sinacosb+cosasinb
sin(a-b)=sinacosb-sinbcosa
cos(a+b)=cosacosb-sinasinb
cos(a-b)=cosacosb+sinasinb
tan(a+b)=(tana+tanb)/(1-tanatanb)
tan(a-b)=(tana-tanb)/(1+tanatanb)
cot(a+b)=(cotacotb-1)/(cotb+cota)
cot(a-b)=(cotacotb+1)/(cotb-cota)
倍角公式
tan2a=2tana/[1-(tana)^2]
cos2a=(cosa)^2-(sina)^2=2(cosa)^2 -1=1-2(sina)^2
sin2a=2sina*cosa
半角公式
sin(a/2)=√((1-cosa)/2) sin(a/2)=-√((1-cosa)/2)
cos(a/2)=√((1+cosa)/2) cos(a/2)=-√((1+cosa)/2)
tan(a/2)=√((1-cosa)/((1+cosa)) tan(a/2)=-√((1-cosa)/((1+cosa))
cot(a/2)=√((1+cosa)/((1-cosa)) cot(a/2)=-√((1+cosa)/((1-cosa))
tan(a/2)=(1-cosa)/sina=sina/(1+cosa)
和差化积
2sinacosb=sin(a+b)+sin(a-b)
2cosasinb=sin(a+b)-sin(a-b) )
2cosacosb=cos(a+b)-sin(a-b)
-2sinasinb=cos(a+b)-cos(a-b)
sina+sinb=2sin((a+b)/2)cos((a-b)/2
cosa+cosb=2cos((a+b)/2)sin((a-b)/2)
tana+tanb=sin(a+b)/cosacosb
积化和差公式
sin(a)sin(b)=-1/2*[cos(a+b)-cos(a-b)]
cos(a)cos(b)=1/2*[cos(a+b)+cos(a-b)]
sin(a)cos(b)=1/2*[sin(a+b)+sin(a-b)]
诱导公式
sin(-a)=-sin(a)
cos(-a)=cos(a)
sin(pi/2-a)=cos(a)
cos(pi/2-a)=sin(a)
sin(pi/2+a)=cos(a)
cos(pi/2+a)=-sin(a)
sin(pi-a)=sin(a)
cos(pi-a)=-cos(a)
sin(pi+a)=-sin(a)
cos(pi+a)=-cos(a)
tga=tana=sina/cosa
万能公式
sin(a)= (2tan(a/2))/(1+tan^2(a/2))
cos(a)= (1-tan^2(a/2))/(1+tan^2(a/2))
tan(a)= (2tan(a/2))/(1-tan^2(a/2))
其它公式
a*sin(a)+b*cos(a)=sqrt(a^2+b^2)sin(a+c) [其中,tan(c)=b/a]
a*sin(a)-b*cos(a)=sqrt(a^2+b^2)cos(a-c) [其中,tan(c)=a/b]
1+sin(a)=(sin(a/2)+cos(a/2))^2
1-sin(a)=(sin(a/2)-cos(a/2))^2
其他非重点三角函数
csc(a)=1/sin(a)
sec(a)=1/cos(a)
双曲函数
sinh(a)=(e^a-e^(-a))/2
cosh(a)=(e^a+e^(-a))/2
tgh(a)=sinh(a)/cosh(a)
发表评论
-
Android生成签名文件并用其对apk文件进行签名(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误完美解决)
2013-09-11 15:09 9708最近编程时遇到问题:写了一个android小程序,打包后用 ... -
Android 引用外部项目库
2013-02-05 16:36 2915项目中要集成其他项目由于集成项目庞大不想机械的copy,就想 ... -
Android网络连接判断与处理
2013-01-29 16:33 22161获取网络信息需要在AndroidManifest.xml文 ... -
Android有用代码片段2
2013-01-22 19:51 2068记得2011年的时候,整理了android有用代码片段这篇文 ... -
android有用代码片段
2013-01-22 19:48 2869有时候,需要一些小的功能,找到以后,就把它贴到了博客下面, ... -
Android 使用draw9patch技术实现不失真背景
2012-09-23 16:27 3604做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了 ... -
Android解析Json(Google Gson)
2012-09-21 09:43 3872什么是JSON? 1.JSON:Javascript ... -
Android第三方包组件实现总结
2012-09-03 15:35 2115前沿: 在android开发过程中,往往会需要创建组件 ... -
Android 获取手机总内存和可用内存等信息
2012-08-17 17:35 5880在android开发中,有时候我们想获取手机的一些硬件信息 ... -
Android中attr自定义属性详解
2012-07-19 10:17 1459首先在你需要使用自定义属性的布局文件中定义标签,当 ... -
Android 读取<meta-data>元素的数据
2012-06-21 13:31 1268在AndroidManifest.xml ... -
获取AndroidManifest里的信息
2012-06-21 12:09 989看附件 -
Java基础之软引用、弱引用、虚引用
2012-06-18 10:02 11551、概述 在JDK1.2以前 ... -
Android播放声音MediaPlayer类详细介绍
2012-06-06 13:13 11924MediaPlayer ... -
Android 画图之抗锯齿
2012-05-30 18:00 1972在画图的时候,图片如果旋转或缩放之 ... -
Android 画布绘图
2012-05-30 17:58 31949我们已经介绍了Canvas,在 ... -
Android中LayoutInflater的使用
2012-05-28 12:15 33582Inflater英文意思是膨胀,在Android中应该是扩展的 ... -
Android 实现从网络上异步加载图像
2012-03-17 15:44 1162研究了android从网络上异步加载图像,现总结如下: (1 ... -
Activity中ConfigChanges属性配置描述
2012-02-08 23:01 2097通过设置这个属性可以使Activity捕捉设备状态变化,以下是 ... -
Android代码混淆
2011-12-26 18:23 3314一个xxx.apk提交给测试、 ok,去倒杯水,看看网页 ...
相关推荐
在Android开发中,Matrix类是图形处理中的一个重要概念,它属于Android的android.graphics包,用于进行二维几何变换,如平移、旋转、缩放和倾斜等。Matrix在Android图形绘制和动画实现中扮演着核心角色,它使得我们...
### Android_Matrix基础+详解 #### 一、矩阵基础理论 在深入探讨Android中`Matrix`类的应用之前,我们首先需要理解矩阵的基本概念及其在图像处理中的应用。 **矩阵定义**: 矩阵是由数字按行和列排列而成的一个...
它基于3x3矩阵,虽然在理论数学中3x3矩阵可以用于3D计算,但在Flash 8中,Matrix主要应用于2D空间内的x轴和y轴变换。这个3x3矩阵由6个参数构成,它们分别是a、b、c、d、tx和ty,各自代表不同的几何变换特性: 1. a:...
本资料“Android应用源码之Matrix.zip”旨在帮助开发者深入理解Android Matrix类的内部实现和应用。下面将详细探讨Matrix类的相关知识点。 一、Matrix基本概念 Matrix类在Android的android.graphics包中,它是一个...
在Android开发中,对图像进行缩放和平移是常见的需求,特别是在ImageView中显示Bitmap时。Matrix类是Android提供的一种强大的工具,...理解并熟练运用Matrix,可以极大地提升Android应用中图像处理的灵活性和用户体验。
在Android中,Matrix提供了多个方法来设置和应用变换: 1. `setIdentity()`: 初始化为单位矩阵,表示无任何变换。 2. `postScale(float sx, float sy)`: 在当前矩阵后面添加缩放变换,sx和sy分别代表水平和垂直方向...
这个“Android Matrix demo”可能是为了展示如何在实际应用中运用Matrix进行图像处理。下面我们将深入探讨Matrix类以及如何在Android中使用它。 Matrix类在Android的`android.graphics`包中,它是用来存储和操作2D...
《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》是一本针对Android平台多媒体开发的详尽指南,旨在帮助Android程序员、研发人员以及对此领域感兴趣的爱好者掌握核心技能,从基础到高级,从理论到实践...
1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下的搭建过程 1.2.3 linux系统下的搭建过程 1.3 常见问题汇总 1.4 使用本书的...
张跃辉-矩阵理论与应用 所有章节的课后答案详解。
Android图像操作一例,使用Matrix.postRotate方法旋转图片,这些的图片格式是BMP,其它格式可能也能用吧,没测试,旋转BMP图片的效果如截图所示,用户单击向左或向右按钮后,图片旋转90度,旋转角度根据自己需要...
总的来说,熟悉和掌握Android的Matrix类对于开发涉及图像处理的应用至关重要。通过灵活运用Matrix的各种方法,可以实现复杂的视图动画和图像操作,提升用户体验。不断实践和尝试不同的Matrix设置,可以帮助开发者更...
在进行图像处理时,理解Matrix的工作原理以及如何与Bitmap结合使用是非常重要的。这不仅可以提升应用的视觉效果,还能够实现各种创新的动画和交互功能。通过不断的实践和探索,开发者可以掌握更多高级技巧,为用户...