Matrix学习

三角函数:

诱导公式记忆口诀:“奇变偶不变,符号看象限”。

“奇、偶”指的是π/2的倍数的奇偶,“变与不变”指的是三角函数的名称的变化:“变”是指正弦变余弦,正切变余切。(反之亦然成立)“符号看象限”的含义是:把角α看做锐角,不考虑α角所在象限,看n·(π/2)±α是第几象限角,从而得到等式右边是正号还是负号。

符号判断口诀:

全,S,T,C,正。这五个字口诀的意思就是说:第一象限内任何一个角的四种三角函数值都是“+”;第二象限内只有正弦是“+”,其余全部是“-”;第三象限内只有正切和余切是“+”,其余全部是“-”;第四象限内只有余弦是“+”,其余全部是“-”。

也可以这样理解:一、二、三、四指的角所在象限。全正、正弦、正切、余弦指的是对应象限三角函数为正值的名称。口诀中未提及的都是负值。

“ASTC”反Z。意即为“all(全部)”、“sin”、“tan”、“cos”按照将字母Z反过来写所占的象限对应的三角函数为正值。


android Matrix

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法。下面是一个乘法的公式:

在Android里面,Matrix由9个float值构成,是一个3*3的矩阵。如下图。

解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的。translateX和translateY表示x和y的平移量。scale是缩放的比例,1是不变,2是表示缩放1/2,这样子。

下面在Android上试试Matrix的效果。

    public class MyView extends View {    

        private Bitmap mBitmap;    

        private Matrix mMatrix = new Matrix();    

        public MyView(Context context) {    

            super(context);    

            initialize();    

        }    

        private void initialize() {         

            mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();            

            float cosValue = (float) Math.cos(-Math.PI/6);    

            float sinValue = (float) Math.sin(-Math.PI/6);    

            mMatrix.setValues(    

                    new float[]{    

                            cosValue, -sinValue, 100,    

                            sinValue, cosValue, 100,    

                            0, 0, 2});    

        }    

        @Override protected void onDraw(Canvas canvas) {    

    //      super.onDraw(canvas);  //当然,如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。    

            canvas.drawBitmap(mBitmap, mMatrix, null);    

        }    

    }    

以左上角为顶点,缩放一半,逆时针旋转30度,然后沿x轴和y轴分别平移50个像素,代码 里面写的是100,为什么是平移50呢,因为缩放了一半。

   大家可以自己设置一下Matrix的值,或者尝试一下两个Matrix相乘,得到的值设置进去,这样才能对Matrix更加熟练。

这里讲的直接赋值的方式也许有点不好理解,不过还好,andrid提供了对矩阵的更方便的方法

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Android里面提供了对Matrix操作的一系

列方便的接口。

Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在

Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。

post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋

转30度,然后平移到(100,100)的地方,那么可以这样做:

Matrix m = new Matrix();    

m.postRotate(30);    

m.postTranslate(100, 100);

这样就达到了想要的效果。

pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话

,就要这样:

Matrix m = new Matrix();    

m.setTranslate(100, 100);    

m.preRotate(30);

旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。

下面给出一个例子。

    package chroya.demo.graphics;    

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.Rect;
    import android.graphics.drawable.BitmapDrawable;
    import android.util.DisplayMetrics;
    import android.view.MotionEvent;
    import android.view.View;    

    public class MyView extends View {    

        private Bitmap mBitmap;
        private Matrix mMatrix = new Matrix();    

        public MyView(Context context) {
            super(context);
            initialize();
        }    

        private void initialize() {    

            Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
            mBitmap = bmp;
            /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
    bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
            mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
                    //平移到(100,100)处
            mMatrix.postTranslate(100, 100);
                    //倾斜x和y轴,以(100,100)为中心。
            mMatrix.postSkew(0.2f, 0.2f, 100, 100);
        }    

        @Override protected void onDraw(Canvas canvas) {
    //      super.onDraw(canvas);  //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。    

            canvas.drawBitmap(mBitmap, mMatrix, null);
        }
    }    

红色的x和y表示倾斜的角度,下面是x,上面是y。看到了没,Matrix就这么简单。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

抽象的说pre方法是向前”生长”, post方法是向后”生长”,具体拿个例子来说,比如一个matrix调用了下列一系列的方法:

matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postScale(0.7f, 1); matrix.postTranslate(15, 0); 则坐标变换经过的4个变换过程依次是:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),

所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的, matrix.postScale(0.7f, 1); matrix.preScale(0.5f, 1); matrix.preTranslate(10, 0); matrix.postTranslate(15, 0);

而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用:

matrix.preScale(0.5f, 1); matrix.postTranslate(10, 0); matrix.setScale(1, 0.6f); matrix.postScale(0.7f, 1); matrix.preTranslate(15, 0); 其坐标变换顺序是

translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1).

setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。

Canvas里scale, translate, rotate, concat方法都是pre方法,如果要进行更多的变换可以先从canvas获得matrix, 变换后再设置回canvas.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Matrix的操作

    Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。
   set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
   post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋转30度,然后平移到(100,100)的地方,那么可以这样做。

Matrix m = new Matrix();

m.postRotate(30);

m.postTranslate(100, 100);

Matrix m = new Matrix();

m.postRotate(30); /////(p1)

m.postTranslate(100, 100); ////(p2)

=== (p1) (p2)m

(矩阵从左往右计算。。。)

这样就达到了想要的效果。

pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话,就要这样:

Matrix m = new Matrix();

m.setTranslate(100, 100); ////p3

m.preRotate(30); ////p4

   ===  m(p4)(p3)

旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行

进一步学习:http://www.360doc.com/content/11/1215/11/7635_172396706.shtml

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-20 13:44:20

Matrix学习的相关文章

Android Matrix类以及ColorMatri

引自:http://www.chinabaike.com/t/37396/2014/0624/2556217.html Android Matrix类以及ColorMatrix类详解 最近在系统学习了android的图像处理(在网上搜集了一些资料并自己编写了测试程序,做了整理),现在这里做一总结: 一.ColorMatrix类 ColorMatrix是一个5x4阶的矩阵 在下面表示为A,第一行表示R红色分量,第二行表示G绿色分量,第三行表示B蓝色分量,第四行表示透明度: 用一维数组的存储方式如下

android.graphics包中的一些类的使用

游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=764 游戏开发系列(opengl es基础知识): http://www.moandroid.com/?p=1730 线性代数(包含矩阵的相关知识): http://dl.iteye.com/topics/download/b56a388a-3408-3179-972b-3a72bdbaaa28 俄

android代码精华 各路大神写的代码精华,大家一起分享

http://gundumw100.iteye.com/blog/940084 带磁性的悬浮窗体,类似于360绿色小人 主要实现的是: 1.悬浮所有窗体之上 2.有吸引力,吸附于屏幕边上 3.有点击效果 http://blog.csdn.net/manymore13/article/details/8577286 Android特效开发(可伸缩View带互相挤压效果 )初级篇 http://blog.csdn.net/manymore13/article/details/12799061 And

A.Kaw矩阵代数初步学习笔记 4. Unary Matrix Operations

“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔记下载(Academia.edu) 第4章课程讲义下载(PDF) Summary Transpose Let $[A]$ be a $m\times n$ matrix. Then $[B]$ is the transpose of $[A]$ if $b_{ji} = a_{ij}$ for al

A.Kaw矩阵代数初步学习笔记 3. Binary Matrix Operations

“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔记下载(Academia.edu) 第3章课程讲义下载(PDF) Summary Addition of matrices Two matrices $[A]$ and $[B]$ can be added only if they are the same size. The addition i

矩阵树定理(Matrix Tree)学习笔记

如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/6420935.html http://blog.csdn.net/Marco_L_T/article/details/72888138 首先是行列式对几个性质(基本上都是用数学归纳法证): 1.交换两行(列),行列式取相反数 2.由1.得若存在两行(列)完全相同则行列式为0 3.上(下)三角行列式即主

ACM学习历程—HDU5490 Simple Matrix (数学 && 逆元 && 快速幂) (2015合肥网赛07)

Problem Description As we know, sequence in the form of an=a1+(n−1)d is called arithmetic progression and sequence in the form of bn=b1qn−1(q>1,b1≠0) is called geometric progression. Huazheng wants to use these two simple sequences to generate a simp

ACM学习历程——HDU5015 233 Matrix(矩阵快速幂)(2014陕西网赛)

Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 233

ACM学习历程——UVA442 Matrix Chain Multiplication(栈)

Description Matrix Chain Multiplication  Matrix Chain Multiplication  Suppose you have to evaluate an expression like A*B*C*D*E where A,B,C,D and E are matrices. Since matrix multiplication is associative, the order in which multiplications are perfo