博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《HTML5游戏编程核心技术与实战》一2.4 坐标变换
阅读量:6859 次
发布时间:2019-06-26

本文共 1639 字,大约阅读时间需要 5 分钟。

本节书摘来异步社区《HTML5游戏编程核心技术与实战》一书中的第2章,第2.4节,作者: 向峰 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 坐标变换

HTML5游戏编程核心技术与实战

在绘制图像的过程中,经常可能需要对图像进行旋转、缩放等变形处理,canvas也提供了一系列的API帮助我们完成这些操作。

关于画布的坐标变换,canvas提供了以下常用的API,这些API的操作必须要在绘制之前调用,否则不会产生任何效果。

translate (x, y):平移,把画布的原点坐标移动到(x, y)位置,x表示将坐标原点向左移x个像素,y表示将坐标原点向下移动y个像素。正常情况下canvas的原点坐标位于左上角,那么我们可以通过translate方法移动原点的坐标,比如以下代码就把原点坐标移动到了canvas的中间位置:

context.translate(canvas.width0.5, canvas.height0.5);
scale (x, y):缩放,把画布放大。x表示水平方向放大倍数,y表示垂直方向放大倍数,如果需要缩小,将这两个参数设置为0~1之间的数就可以了,比如context.scale (0.5, 0.5)表示把图形缩小一半。
rotate (angle):把图形进行旋转。angle表示旋转的角度,旋转的中心点是原点,旋转是以顺时针方向进行,angle设置成负数就是逆时针旋转。需要注意的是angle是以弧度表示,比如要顺时针旋转90度可以使用context.rotate (Math.PI*0.5)。
transform (m11, m12, m21, m22, dx, dy):把当前的矩阵乘上如图2-20所示的矩阵,做矩阵叠加操作。
setTransform (m11, m12, m21, m22, dx, dy):设置当前的变换矩阵为图2-20所示的矩阵。
以下代码在canvas的中间位置绘制了棵小树:
w1

代码中,首先计算出canvas的中心坐标(cx, cy),然后把canvas画布原点移动到点(cx, cy)。由于画布的原点移动到点(cx, cy)位置,那么,drawImage (img, dx, dy)表示的是把图片以(dx, dy)为左上角开始绘制。所以,如果要绘制到中央,需要偏移半个宽度和高度,即使用坐标点(−w/2, −h/2)。最终效果如图2-21所示,黑线表示canvas的边框。

2_20_21

rotate方法描述的是图像绕原点旋转,假设要实现绕某一个图像的中心点旋转,如何实现呢?对了,我们可以先把画布的原点移动到图像的中心点,然后就可以进行旋转操作了。

以下代码绘制了在画布中央,一个绕自身中心旋转并且放大了一倍的小树。

w2

这段代码中,我们定义了一个draw方法,用于绘制图像,在绘制图像的过程中,首先保存当前的绘图状态,然后把画布移动到中心,进行旋转和放大,最后恢复画布状态。注意,如果不进行保存和恢复状态的操作,则由于使用这些变换操作都将改变当前变换矩阵的状态,从而影响下一次的变换。

定义了draw方法后,设置了一个定时器,每30毫秒改变全局的角度,形成一个旋转的动画,具体的效果如图2-22所示。

2_22

本质上,前面所介绍的rotate()、scale()、translate()等方法最终都会转换成矩阵的形式进行操作,这种对应如下所示:

translate(x, y)  transform(1, 0, 0, 1, x, y)scale(x, y)  transform(sx, 0, 0, sy, 0, 0)rotate(deg)  transform(cos(deg), sin(deg), -sin(deg), cos(deg), 0, 0)

由于本质上这些变换操作都会进行矩阵和三角函数的相关运算,特别是旋转操作,所以这些变换操作将消耗更多的时间,特别是在手持设备上使用更为明显。

转载地址:http://baiyl.baihongyu.com/

你可能感兴趣的文章
redis 相关操作
查看>>
新近爆出的runc容器逃逸漏洞,用户如何面对?
查看>>
Thymeleaf教程 (九) 局部变量
查看>>
如何选择PHP项目的开发方案?
查看>>
java 面试题
查看>>
定时刷新 JS
查看>>
centos7 安装gitlab
查看>>
div+css实现的左右两个等高div
查看>>
Linux学习笔记-忘了第几天了:简单的用户管理命令
查看>>
教你3分钟搞定Linux正则表达式
查看>>
& 号和管道符号(|)在不同场景下的使用方法
查看>>
cssSourceMap: true 的作用
查看>>
app定位经纬度出现5e-324的情况
查看>>
是什么让程序员成了一份苦逼的工作?
查看>>
程序员如何做好应聘?简历、面试和Offer
查看>>
阿里云MVP课堂:零基础建站,满足你拥有自己网站的心愿
查看>>
(十七) 整合spring cloud云架构 -消息驱动 Spring Cloud Stream
查看>>
mysql主从同步,安装配置操作
查看>>
推荐:并发情况下:Java HashMap 形成死循环的原因
查看>>
C++ unordered_map using a custom class type as the key
查看>>