Matrix矩阵的基础案例与分析
使用Matrix矩阵进行矩形的绘制,进而属性matrix的使用方式,深入了解matrix的原理。
//1、使用默认的Matrix,绘制默认状态的矩形,宽高都是50像素Rect rect = new Rect(0, 0, 50, 50);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);
图-1
//2、平移到屏幕的中心Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);//图-2//由于Matrix的原始坐标原点在0,0,所以矩形的左上角与屏幕中心点重合,如果要想矩形的中心与屏幕的中心重合//需要算上矩形的中心坐标,mScaleMatrix.postTranslate(getWidth()/2-25,getHeight()/2-25);//在平移至屏幕中心点后,减去矩形一半的平移量.图-2-1//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);
图-2
图-2-1
//3、缩放//在默认位置放大2倍Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postScale(2,2);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);
图-3
//4、平移+缩放//以屏幕中心点为中心放大2倍---错误的做法Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postScale(2,2,getWidth()/2,getHeight()/2);Log.i(TAG,mScaleMatrix.toShortString());//[2.0, 0.0, -540.0][0.0, 2.0, -792.0][0.0, 0.0, 1.0]float[] values = new float[9];mScaleMatrix.getValues(values);Log.i(TAG,"X:平移量:"+values[Matrix.MTRANS_X]);Log.i(TAG,"Y:平移量:"+values[Matrix.MTRANS_Y]);Log.i(TAG,"屏幕的高:"+getHeight());Log.i(TAG,"屏幕的宽:"+getWidth());//X:平移量:-540.0//Y:平移量:-792.0//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//如图-4,根本看不到那个矩形,原因已经在注释中说明了,上面的代码会导致矩形反向平移出屏幕,所以根本看不到。//正确的做法:先平移,在以平移后的中心点进行缩放,才能达到效果mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);mScaleMatrix.postScale(2,2,getWidth()/2,getHeight()/2);//图4-1
图-4
图4-1
//5、旋转//以0,0起始坐标点旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postRotate(45);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//图-5
图-5
//6、平移+旋转//以屏幕中心点,旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);mScaleMatrix.postRotate(45,getWidth()/2,getHeight()/2);//将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect,paint);//图-6
图-6
//7、平移+旋转,看pre 和post的区别,结果都是 图-7
// //方法一:
// //以屏幕中心点,旋转45度
// Rect rect = new Rect(0, 0, 50, 50);
// mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);
// mScaleMatrix.postRotate(45,getWidth()/2,getHeight()/2);// //方法二:
// //以屏幕中心点,旋转45度
// Rect rect = new Rect(0, 0, 50, 50);
// mScaleMatrix.postRotate(45);
// mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);
// //方法三:
// //以屏幕中心点,旋转45度
// Rect rect = new Rect(0, 0, 50, 50);
// mScaleMatrix.preRotate(45);
// mScaleMatrix.postTranslate(getWidth()/2,getHeight()/2);//方法四://以屏幕中心点,旋转45度Rect rect = new Rect(0, 0, 50, 50);mScaleMatrix.preRotate(30, getWidth() / 2, getHeight() / 2);Log.i(TAG,mScaleMatrix.toShortString());mScaleMatrix.preTranslate(getWidth() / 2, getHeight() / 2);Log.i(TAG,mScaleMatrix.toShortString());//preXXXX:以pre开头,例如preTranslate postXXXX:以post开头,例如postScale//post-前乘或者叫左乘//pre-后乘或者叫右乘//如果平移和旋转后结果不是预想的,需要注意上述操作的矩阵结果,打印出来一看便知//看源码-以平移为例/*** Preconcats the matrix with the specified translation. M' = M * T(dx, dy)public boolean preTranslate(float dx, float dy) {nPreTranslate(native_instance, dx, dy);return true;}*//*** Postconcats the matrix with the specified translation. M' = T(dx, dy) * Mpublic boolean postTranslate(float dx, float dy) {nPostTranslate(native_instance, dx, dy);return true;}*///将Matrix矩阵设置给canvas,并绘制矩形canvas.setMatrix(mScaleMatrix);canvas.drawRect(rect, paint);
图-7
Matrix矩阵的基础案例与分析相关推荐
- 视觉SLAM中,本质矩阵、基础矩阵、单应性矩阵自由度和秩分析
视觉SLAM中,本质矩阵.基础矩阵.单应性矩阵自由度和秩分析 1.各个矩阵的自由度 由于基础矩阵和本质矩阵都是由对极约束来的 1.1 本质矩阵E的自由度为5,秩为2 1.1.1 自由度: 首先,旋转和 ...
- Eigen入门系列 —— Eigen::Matrix矩阵点乘、叉乘、转置、求逆、求和、行列式、迹、数乘
Eigen入门系列 -- Eigen::Matrix矩阵点乘.叉乘.转置.求逆.求和.行列式.迹.数乘 前言 程序说明 输出结果 代码示例 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D ...
- 计算机视觉三维重建的几何基础:坐标系与关键矩阵(基础矩阵、本质矩阵、单应矩阵)...
作者丨李迎松@知乎 来源丨https://zhuanlan.zhihu.com/p/159194599 编辑丨3D视觉工坊 你站在桥上看风景, 看风景人在楼上看你. 明月装饰了你的窗子, 你装饰了别人 ...
- 计算机视觉中本质矩阵的概念,【计算机视觉】Lecture 19:本质矩阵和基础矩阵...
对极几何 左边 极点:相机1所看到的相机2的位置. 右边 极点:相机2所看到的相机1的位置 对极几何 对应点位于共轭极线上 对极几何 给定一幅图像中的一个点,我们如何确定在第二幅图像中要搜索的对应极线 ...
- 理解CSS3 transform中的Matrix(矩阵)
一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如"拉普拉斯不等式").这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面& ...
- 矩阵正态分布基础1 外形式、外积与微分形式简介
矩阵正态分布基础1 外形式.外积与微分形式简介 外形式 外积 k-微分形式 因为不是讨论微分流形的,所以只是给一些定义方便后续要用的时候查阅:要系统性学习还请参考微分流形的教材. 外形式 定义1.1( ...
- TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
TF学习:Tensorflow基础案例.经典案例集合--基于python编程代码的实现 目录 Tensorflow的使用入门 1.TF:使用Tensorflow输出一句话 2.TF实现加法 3.TF实 ...
- JQuery-学习笔记04【基础——JQuery基础案例】
Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...
- [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对比度、亮度处理
前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包括:通过打开相册里的图片,使用Matrix对图像进行缩放. ...
最新文章
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- Quartz.net 定时任务矿建Demo
- 怎样用hibernate验证登陆界面的用户名和密码
- Linux 性能监测:Memory
- [软件推荐]使用OneNote来构建你自己的知识库(OFFICE2010)
- inode与ln命令
- HDU 4081 Qin Shi Huang's National Road System
- 通过python切换hosts文件
- 利用R语言绘制世界航班路线图
- Treeview的文件目录配置
- python爬虫爬当当网_python爬取当当网图书排行榜
- 最新系统分析师考试大纲
- 福建省小学四年级上册计算机知识点总结,小学四年级上册数学知识点大全【1-6单元】...
- Android 计时器Chronometer 使用及源码分析
- 环网交换机的主要作用是什么?
- 百度登录界面CSS+HTML
- 正则表达式中反斜杠的另一用法
- PostgreSQL隐藏列(兼容oracle)
- mysql服务重启和关闭
- Ubuntu ROS 安装