android 矩阵坐标转换,Android 的坐标系及矩阵变换

#Android 的坐标系及矩阵变换

##Android的坐标系

##2D坐标系

android的2d坐标系如图所示,水平向右为X轴正方向,竖直向下为Y轴正方向,原点为屏幕左上角。

4dd26de1488294cedbe76c38a7176dce.png

注意:以屏幕左上角为原点的坐标系,称作绝对坐标系,将原点平移到View的左上角,称作相对坐标系。对View进行操作时,更多使用的是相对坐标系。

##3D坐标系

###左手坐标系

在计算机科学中,大多3D坐标系使用的是左手坐标系(包括Android),所以,在这里只介绍左手坐标系。

用左手确定3D坐标系:

1ff1fb66d10ac64f51b2a88dba3ad8d9.png

在Android设备中反应出的3D坐标系是,X轴水平向右,Y轴竖直向上,Z轴垂直屏幕指向屏幕内部。

有没有觉得很疑惑,明明在2D坐标系中Y轴正方向是竖直向下的,怎么到3D坐标系就变成竖直向上了?其实,2D坐标系和3D坐标系是没有直接关系的,绘制View使用的是2D坐标系,3D坐标系则是进行3D变换,求得3D变换矩阵。2D坐标通过3D变换矩阵,改变x坐标和y坐标。

注意:2D和3D坐标系之间没有直接关系

同样,根据坐标原点的不同也可分为绝对坐标系和相对坐标系。

###确定旋转正方向

由于使用的是左手坐标系,伸出左手,握住坐标系,大拇指指向轴的正方向,四指指向的方向即为旋转的正方向。如图所示:

d5cbbb5793983c4066dd36d1451b1042.png

###屏幕上点的表示

在屏幕上显示的点,不仅仅有x,y坐标(这里的x,y坐标是2D坐标系的坐标),其实还有z轴的影响,z轴坐标可以理解成物体与镜头的距离。所以这里对应的像素描述由一个3行一列的矩阵来表示:

d5d36f3465c5a6d3bc64bd3f42c4f5da.png

x,y分别代表x,y轴上的坐标,而1代表屏幕在z轴上的坐标为默认的。如果将1变大,那么屏幕会拉远, 图形会变小。

###旋转变化的是坐标系

任何变换都是基于坐标系变化发生的。比如,绕Z轴旋转,改变的是点在XOY平面的映射,所以绕Z轴旋转等同于XOY的坐标系旋转后,旧坐标系的点在新坐标系中的坐标的计算过程。计算过程如下:

在原坐标系xoy中, 绕原点沿逆时针方向旋转θ度, 变成座标系 sot。

设有某点p,在原坐标系中的坐标为 (x, y), 旋转后的新坐标为(s, t)。

a5b664f0384166d06824c724c2f0b114.png

oa = y sin(θ) (2.1)

as = x cos(θ) (2.2)

综合(2.1),(2.2) 2式

s = os = oa + as = x cos(θ) + y sin(θ)

t = ot = ay – ab = y cos(θ) – x sin(θ)

用行列式表达如下:

7635d276a744936b7931dea00a30ba5c.png

由上面的结果可以得出绕Z轴旋转的变换矩阵为:

f44d05be7c847af404b56d989f94798f.png

更多3D旋转矩阵可参考:

http://blog.csdn.net/zsq306650083/article/details/8773996

###变换矩阵在2D平面的表现

根据绕Z轴旋转的变换矩阵,可以求得旋转后的坐标。θ为绕Z轴旋转角度,P0(x0,y0,1)为旋转前的坐标,P1(x1,y1,1)为旋转后的坐标。

计算出:

793bddd2ef5db5a782ceed9e39c7cfdc.png

由此可以得到在XOY平面的旋转示意图:

4cfcea639c95ad2445b888c7a4c33faa.png

可以看到,变换矩阵不仅决定点变换后的坐标,也决定了点旋转的方向。

###矩阵的初等变换

上面的矩阵相乘用到的是矩阵初等变换的知识,这里贴一下矩阵初等变换的一些结论:

d35dee15298ccb8a8058aeb5a3679256.png

###改变旋转的中心点

以上得出的绕Z轴旋转的旋转矩阵是基于原点,如果要改变旋转的中心点,该怎么做?

设中心点坐标O1(x2,y2,1),P0(x0,y0,1),XO1Y坐标系中P1(x1,y1,1),变换后P3(x3,y3,1)。

经过旋转矩阵变换P3的坐标:

7389ed10d71ecd8a3cd6c1ed763d5f82.png

P0和P1之间的关系:

93d5d77d21a49c206c095476fa6003a0.png

P3的坐标:

1df219a444f9bd823807b312690a9fd0.png

由于有:

1068758239c37c5e8ce1e9fdc59c21d1.png

最终得到P3在XOY坐标系的坐标:

c104e53bb57499955d9f4a921ae895b1.png

上面是纯数学计算过程,其实通过矩阵的初等变换来更好理解和记忆:

f838663519a8a22596e9dafb8964e398.png

所以,在获得变换矩阵后,如果需要改变中心点坐标,通常会使用下面两行代码:

matrix.preTranslate(-centerX,-centerY);

matrix.postTranslate(centerX,centerY);

###关于Camera类

为了方便获取变换矩阵,Android提供了Camera类获取变换矩阵,但是要注意,所有的变换都是基于原点的。

##绕Z轴旋转Demo

https://github.com/wslaimin/RotationZ.git

552728271151034ab2cf1f814cd564b5.png

#参考文章

http://www.2cto.com/kf/201605/510416.html

http://blog.csdn.net/zsq306650083/article/details/8773996

http://blog.csdn.net/Tangyongkang/article/details/5484636

http://blog.csdn.net/flash129/article/details/8234599

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值