Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate

2024-01-03 09:08

本文主要是介绍Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Matrix的3*3矩阵:

[java]  view plain copy
  1. {MSCALE_X,MSKEW_X,MTRANS_X,    
  2. MSKEW_Y,MSCALE_Y,MTRANS_Y,    
  3. MPERSP_0,MPERSP_1,MPERSP_2}    

一、平移(Translation)变换

Translation的变换是通过改变MTRANS_X和MTRANS_Y来实现的,Matrix提供了三个方法

preTranslate(float dx, float dy)

setTranslate(float dx, float dy)

postTranslate(float dx, float dy)

平移的变换特别简单,相信学过数学的人都知道,不说了。


二、扭曲(Skew)变换

skew变换是通过改变MSKEW_X,和MSKEW_Y来实现的,Matrix提供了下面的几个方法来设置skew

        matrix.setSkew(kx, ky)
        matrix.setSkew(kx, ky, px, py)
我能说其实关键就是,kx和ky传入的tan值吗?

经过自己测试,发现skew的变换是如下的规律:

点(x,y)经过skew(kx,ky,px,py)变换之后,坐标为(kx*(y-py)+px,ky*(x-px)+py),如果,px和py没有,则默认为都为0。

图片变换的效果




三、旋转(Rotate)的变换

[java]  view plain copy
  1. {MSCALE_X,MSKEW_X,MTRANS_X,    
  2. MSKEW_Y,MSCALE_Y,MTRANS_Y,    
  3. MPERSP_0,MPERSP_1,MPERSP_2}    
Rotate的变换是通过设置4个值来改变的,MSCALE_X,MSKEW_X,MSKEW_Y,MSCALE_Y来进行变换的,有如下的方法

        matrix.setRotate(degrees)
        matrix.setRotate(degrees, px, py)
        matrix.preRotate(degrees)
        matrix.preRotate(degrees, px, py)
        matrix.postRotate(degrees)
        matrix.postRotate(degrees, px, py)

这就不用解释了,degrees即我们要旋转的度数,px,py是我们旋转的角度通过这个设置,它会直接改变matrix矩阵里面的值,得到相应的变换矩阵。


还可以通过具体设置我们想要旋转的sin、cos角度来得到变换

        matrix.setSinCos(sinValue, cosValue)
        matrix.setSinCos(sinValue, cosValue, px, py)



Android中Matrix的set、pre、post的区别

说set、pre、post的区别之前,先说说Matrix。

Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配。

Matrix提供了四种操作:

  • translate(平移)
  • rotate(旋转)
  • scale(缩放)
  • skew(倾斜)

也就是说这4种操作都是对这个3 X 3的矩阵设值来达到变换的效果。

Matrix没有结构体,它必须被初始化,通过reset或set方法。

OK,Matrix介绍完了,我们来看看set、pre、post的区别。

pre是在队列最前面插入,post是在队列最后面追加,而set先清空队列在添加(这也是上文提到的“Matrix没有结构体,它必须被初始化,通过reset或set方法”的原因)。

下面通过一些例子具体说明:

  1. matrix.preScale(2f,1f);    
  2. matrix.preTranslate(5f, 0f);   
  3. matrix.postScale(0.2f, 1f);    
  4. matrix.postTranslate(0.5f, 0f);  
执行顺序:translate(5, 0) -> scale(2f, 1f) -> scale(0.2f, 1f) -> translate(0.5f, 0f)
  1. matrix.postTranslate(2f, 0f);   
  2. matrix.preScale(0.2f, 1f);     
  3. matrix.setScale(1f, 1f);   
  4. matrix.postScale(5f, 1f);   
  5. matrix.preTranslate(0.5f, 0f);   

执行顺序:translate(0.5f, 0f) -> scale(1f, 1f) ->  scale(5f, 1)


这篇关于Matrix学习3、Matrix的基本三种变换之Translation、Skew、Rotate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565181

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样