一、Android矩阵

大学学的线性代数和矩阵基本忘记的差不多了,理解起矩阵Matrix着实有点费劲,记了一次笔记还把左乘右乘记错了。

1.1 使用场景

项目中会使用到矩阵的场景:

  1. 背景图片,指定位置为中心点的缩放,图片平移,图片旋转。
  2. opengles 中GLSurfaceView所承载的内容需要缩放,平移变换。是内容变换不是窗口glViewport 变换

【注意】:这里提到了两种场景就对应了两种坐标体系,2种矩阵

  • 图片场景的矩阵,也就是 android.graphics.Matrix 后文用Android Matrix表示,是 2维坐标,3*3 矩阵。
  • opengles 矩阵 android.opengl.Matrix 后文用opengles 矩阵,后文用opengles Matrix 表示,是 4*4 矩阵。
  • android里也有 44矩阵 android.renderscript.Matrix4f 这个是矩阵和 android.opengl.Matrix 矩阵是能对的上的,都是3维坐标, 44矩阵。后文用 Matrix4f 表示。之所以引入这个是这个类有些方法比opengles Matrix 类的方法使用起来会更简单点。不用该矩阵其实也问题不大

二、 Android Matrix

2.1、元素表达

3*3矩阵,没个元素表达的意思:

  • MTRANS_X、MTRANS_Y 同时控制着 Translate (平移)
  • MSCALE_X、MSCALE_Y 同时控制着 Scale (缩放)
  • MSCALE_X、MSKEW_X、MSCALE_Y、MSKEW_Y 同时控制着 Rotate (旋转)
  • MSKEW_X、MSKEW_Y 同时控制着 Skew (倾斜,扭曲)

【注】:项目中没有使用Skew和Rotate不详细讨论

2.2、 set post pre

这里强调这三个函数是因为很容易歧义,但是实际使用中最常用绕不开就是这几个简单操作。Translate ,Scale ,Skew 都有这三个函数,以平移为例:

  1. m.setTranslate 直接设置位移量,m的其它参数变为单位矩阵的初始量。不涉及乘法
  2. m.postTranslate m左乘一个位移矩阵
  3. m.preTranslate m右乘一个位移矩阵

因为存在post 和pre ,就要区分这两个函数的区别,就容易逻辑开叉到底,post和pre哪个是左乘,哪个是右乘。什么场合用post,什么场合用pre。

重学了一遍线性代数里矩阵的一些知识,越学越懵,也读了不少blog,有些说post 是左乘,有些说post是右乘,我的笔记里第一次也是记post为右乘。虽然 也有看post函数的注释,但是理解上还是出现了偏差:
1、官方注释

   /*** Postconcats the matrix with the specified translation. M' = T(dx, dy) * M*/public boolean postTranslate(float dx, float dy) {nPostTranslate(native_instance, dx, dy);return true;}

2、识记理解
这里:M’ = T(dx, dy) * M 其中:M是原矩阵,T是位移阵可以理解为目标变换。目标变换在左边就是左乘。目标变换在右边就是右乘。

  • post 是左乘
  • pref 是右乘

3、post VS pref
关于左乘右乘区别说的比较好的有2个观点:
https://www.zhihu.com/question/263660493
空间中的向量用列向量表示。

  1. 左乘是行变换,右乘是列变换。矩阵左乘列向量就是把它在空间当中做变换。
  2. 在固定坐标系里,用左乘。在非固定坐标系用右乘。Android是固定坐标系。

小结:
1、Android的Matrix 的几何变换可以都用post来计算,因为Android是固定坐标系空间变换用post左乘来来做是符合逻辑的。同一组计算变换里一会用post一会用pre逻辑容易乱,需要改变顺序的时候可以拿两个矩阵通过写A.postConcat(B) 或者B.postConcat(A)来修改。

2、android.renderscript.Matrix4f ,android.opengl.Matrix这两个4*4矩阵是能对应的起来的。这两个矩阵类里是不存在post和pref一说,里面的变换都是左乘 post的方式。所以理解起来反而更简单。so,我认为android Matrix都用post来更好理解

三、android Matrix 实际使用

场景一:指定点的放大,缩小。
opengles 的矩阵在这里不详述,因为它的坐标系和坐标比例计算方式都不一样。opengles 坐标依赖顶点坐标和[-1,1]范围计算。后面再写一篇介绍。

1、可以直接用指定点放大缩小函数

m.setScale(scale, scale, cx, cy)

2、使用平移和缩放(android.opengl.Matrix和Matrix4f 都没有上一种方法)
T(cx,cy)*S(s,s)*T(-cx,-cy)*m
因为android的坐标0,0是左上角,如果是opengles 移动的点第一次变换就不是m.postTranslate(-cx, -cy)

// android matrix
//平移原点到目标点
m.postTranslate(-cx, -cy)
m.postScale(scale, scale)
m.postTranslate(cx, cy)

opengl es的矩阵

//opengles matrix
Matrix4f matrix4f = new Matrix4f();
matrix4f.loadTranslate(x, y, 0);
matrix4f.scale(scaleX,scaleX,1);
//满足结合率,所以可以先算变换矩阵
matrix4f.translate(-x,-y,0);
current.multiply(matrix4f);

3、先缩放再平移
这边的1相关是推导出来的公式

m.postScale(scale, scale)
m.postTranslate(-(scale-1)*cx,-(scale-1)*cy)

4、推导的一些公式
指定点放大缩小:位移,中心点,倍数之间最后效果的时候关系
cx,cy:定点x,定点y
dx:平移
s:缩放倍数
dx = -(s-1)*cx = (1-s)*cx
cx = dx/(1-s)
同理
cy = dy/(1-s)

【注】:同样适用于

  • android.renderscript.Matrix4f
  • android.opengl.Matrix

一、Android Matrix 矩阵相关推荐

  1. Android 自定义View ——Matrix (矩阵)

    Matrix的作用: Matrix类包含一个3x3矩阵,用于转换坐标 Matrix (矩阵) 的原理很遗憾自己目前也是含糊的很,这里就不说了,记录自己在项目使用的方法, 这里就简单的记录下Matrix ...

  2. 了解Android Matrix转换

    原文 了解Android Matrix转换 很多年前,在学校我学习了矩阵. 我记不太清楚了,但我记得的是在想,"但是......你对这些知识做了什么呢?" 快进几年,我开始作为An ...

  3. android Matrix图片变换处理

    今天,讲讲android  Matrix图片变换处理的内容. Matrix 对于一个图片变换的处理,需要Matrix类的支持,它位于"android.graphics.Matrix&qu ...

  4. Matrix矩阵的图像处理

    Matrix矩阵的图像处理 矩阵的规则: 矩阵A与矩阵B能进行乘法操作的条件: 当矩阵A的列数等于矩阵B的行数时,A与B可以相乘. 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 乘积C的第 i ...

  5. android matrix 简书,[Android] ImageView ScaleType完全解析

    ImageView有一个ScaleType的属性,该属性决定了图片在ImageView上的展现形式,包括:是否进行缩放.如何进行缩放.缩放之后图片的摆放位置等等.官方介绍如下: Options for ...

  6. Android Matrix的代码验证和应用

    Matrix介绍 : Android Matrix的用法总结(链接:ttp://blog.csdn.net/jdsjlzx/article/details/52741445) 代码验证 前面讲到的各种 ...

  7. keyboard Matrix矩阵键盘

    文章目录 一.功能实现(代码) 1.1 添加编译选项 1.2 添加设备树节点 1.2.1 添加kpp节点 1.2.2 在iomuxc中添加pinctrl_复用节点 1.2.3 屏蔽其他设备节点占用的键 ...

  8. R语言使用upper.tri函数、lower.tri函数、diag函数改变matrix矩阵上三角形、下三角形、对角线的数值

    R语言使用upper.tri函数.lower.tri函数.diag函数改变matrix矩阵上三角形.下三角形.对角线的数值 目录

  9. Android的矩阵(一):ColorMatrix

    最近的学习过程中看到关于android色彩矩阵的内容,以前看到这部分内容,基本都是跳过的,没有认真细读. 自己给自己找的借口是: 1,大一学的矩阵内容早就忘的干干净净了,当时学的时候就很烦人,所以现在 ...

最新文章

  1. Bytomd 助记词恢复密钥体验指南
  2. 使用rancher创建负载均衡服务
  3. html css基础知识
  4. 中间件:ElasticSearch组件RestHighLevelClient用法详解
  5. 的电路接法_基本震荡电路知多少,汇总几种震荡电路的接法!
  6. http 使用curl发起https请求 error 60 51
  7. L1-011. A-B-PAT团体程序设计天梯赛(GPLT)
  8. 远程升级stm32程序_艾拉比智能成为意法半导体STM32战略合作伙伴
  9. echart移上去显示内容_Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法...
  10. talk record
  11. TTime::FormatL详解
  12. 点击化学试剂Methyltetrazine-propylamine HCl salt(1802908-03-7)特点分析
  13. 绿色版mysql8.0.25的卸载安装与基础使用
  14. java数值滑动条_java中的滑杆和进度指示条的输入数据
  15. #、##、#@在#define中的用法
  16. 使用欧镭2D雷达ROS驱动
  17. 计算机病毒金山毒霸,金山毒霸网络版成为计算机病毒的客星
  18. Arduino文档阅读笔记-4 WHEEL ROBOT CAR BASIC EXAMPLE
  19. opencv图像处理初步(一):灰度化和二值化
  20. 通信原理chapter2总结(内含多径效应和多普勒效应MATLAB仿真)

热门文章

  1. Jenkins 构建CI/CD(一看就会)
  2. 如何打开墨子平台的基础数据管理工具
  3. 【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据
  4. 微信小程序中如何实现微信支付
  5. Android Studio中的button修改不了背景颜色
  6. 【漏洞复现】CVE-2022-22954 VMware Workspace ONE Access漏洞分析
  7. 介绍计算机硬件的英语作文带翻译,自我介绍作文之英语作文自我介绍带翻译(35页)-原创力文档...
  8. 原创:史上最全最通俗易懂的,索引最左前缀匹配原则(认真脸)
  9. 2015年个人收获-成果、经验分享(项目经理、集成资质、网站开发、服务器等)
  10. 向微信公众号文章中添加mp4、rar、zip等文件给用户下载