一、Android Matrix 矩阵
一、Android矩阵
大学学的线性代数和矩阵基本忘记的差不多了,理解起矩阵Matrix着实有点费劲,记了一次笔记还把左乘右乘记错了。
1.1 使用场景
项目中会使用到矩阵的场景:
- 背景图片,指定位置为中心点的缩放,图片平移,图片旋转。
- 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 都有这三个函数,以平移为例:
- m.setTranslate 直接设置位移量,m的其它参数变为单位矩阵的初始量。不涉及乘法
- m.postTranslate m左乘一个位移矩阵
- 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
空间中的向量用列向量表示。
- 左乘是行变换,右乘是列变换。矩阵左乘列向量就是把它在空间当中做变换。
- 在固定坐标系里,用左乘。在非固定坐标系用右乘。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 矩阵相关推荐
- Android 自定义View ——Matrix (矩阵)
Matrix的作用: Matrix类包含一个3x3矩阵,用于转换坐标 Matrix (矩阵) 的原理很遗憾自己目前也是含糊的很,这里就不说了,记录自己在项目使用的方法, 这里就简单的记录下Matrix ...
- 了解Android Matrix转换
原文 了解Android Matrix转换 很多年前,在学校我学习了矩阵. 我记不太清楚了,但我记得的是在想,"但是......你对这些知识做了什么呢?" 快进几年,我开始作为An ...
- android Matrix图片变换处理
今天,讲讲android Matrix图片变换处理的内容. Matrix 对于一个图片变换的处理,需要Matrix类的支持,它位于"android.graphics.Matrix&qu ...
- Matrix矩阵的图像处理
Matrix矩阵的图像处理 矩阵的规则: 矩阵A与矩阵B能进行乘法操作的条件: 当矩阵A的列数等于矩阵B的行数时,A与B可以相乘. 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数. 乘积C的第 i ...
- android matrix 简书,[Android] ImageView ScaleType完全解析
ImageView有一个ScaleType的属性,该属性决定了图片在ImageView上的展现形式,包括:是否进行缩放.如何进行缩放.缩放之后图片的摆放位置等等.官方介绍如下: Options for ...
- Android Matrix的代码验证和应用
Matrix介绍 : Android Matrix的用法总结(链接:ttp://blog.csdn.net/jdsjlzx/article/details/52741445) 代码验证 前面讲到的各种 ...
- keyboard Matrix矩阵键盘
文章目录 一.功能实现(代码) 1.1 添加编译选项 1.2 添加设备树节点 1.2.1 添加kpp节点 1.2.2 在iomuxc中添加pinctrl_复用节点 1.2.3 屏蔽其他设备节点占用的键 ...
- R语言使用upper.tri函数、lower.tri函数、diag函数改变matrix矩阵上三角形、下三角形、对角线的数值
R语言使用upper.tri函数.lower.tri函数.diag函数改变matrix矩阵上三角形.下三角形.对角线的数值 目录
- Android的矩阵(一):ColorMatrix
最近的学习过程中看到关于android色彩矩阵的内容,以前看到这部分内容,基本都是跳过的,没有认真细读. 自己给自己找的借口是: 1,大一学的矩阵内容早就忘的干干净净了,当时学的时候就很烦人,所以现在 ...
最新文章
- Bytomd 助记词恢复密钥体验指南
- 使用rancher创建负载均衡服务
- html css基础知识
- 中间件:ElasticSearch组件RestHighLevelClient用法详解
- 的电路接法_基本震荡电路知多少,汇总几种震荡电路的接法!
- http 使用curl发起https请求 error 60 51
- L1-011. A-B-PAT团体程序设计天梯赛(GPLT)
- 远程升级stm32程序_艾拉比智能成为意法半导体STM32战略合作伙伴
- echart移上去显示内容_Echarts X轴内容过长自动隐藏,鼠标移动上去显示全部名称方法...
- talk record
- TTime::FormatL详解
- 点击化学试剂Methyltetrazine-propylamine HCl salt(1802908-03-7)特点分析
- 绿色版mysql8.0.25的卸载安装与基础使用
- java数值滑动条_java中的滑杆和进度指示条的输入数据
- #、##、#@在#define中的用法
- 使用欧镭2D雷达ROS驱动
- 计算机病毒金山毒霸,金山毒霸网络版成为计算机病毒的客星
- Arduino文档阅读笔记-4 WHEEL ROBOT CAR BASIC EXAMPLE
- opencv图像处理初步(一):灰度化和二值化
- 通信原理chapter2总结(内含多径效应和多普勒效应MATLAB仿真)
热门文章
- Jenkins 构建CI/CD(一看就会)
- 如何打开墨子平台的基础数据管理工具
- 【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据
- 微信小程序中如何实现微信支付
- Android Studio中的button修改不了背景颜色
- 【漏洞复现】CVE-2022-22954 VMware Workspace ONE Access漏洞分析
- 介绍计算机硬件的英语作文带翻译,自我介绍作文之英语作文自我介绍带翻译(35页)-原创力文档...
- 原创:史上最全最通俗易懂的,索引最左前缀匹配原则(认真脸)
- 2015年个人收获-成果、经验分享(项目经理、集成资质、网站开发、服务器等)
- 向微信公众号文章中添加mp4、rar、zip等文件给用户下载