主要内容
多个转换
现在,你已经学会了基础的平移、旋转与缩放。让我们来谈谈我们在开始的时候掠过的复杂部分,并且看看如何将他们一起使用。
顺序很重要
当您执行多个转换时, 顺序会产生影响。先旋转,再平移,最后缩放得到的结果与先平移,再旋转,最后缩放的结果是不一样的。下面是一个示例程序:
你使用的顺序取决于所需的效果。请记住,你移动的是图纸,而不是对象本身。你应该找到适合你的顺序。
变换矩阵
每次进行旋转、平移或缩放时,执行转换所需的信息都会被放到到一个数字表中。这张表,或者说矩阵(Matrix),只有很少的几行和几列。然而,通过神奇的数学成就,它包含了执行任何一系列转换所需的所有信息。这就是为什么
pushMatrix()
与 popMatrix()
的名字里有这个词。名字的推入(push)和弹出(pop)部分呢?这些都来自一个被称为堆栈(stack)的计算机概念。它的工作原理就像自助餐厅里的一个带弹簧的盘子容器。当有人将盘子放在上面的时候,盘子的重量会使其向下沉(push)。当有人需要盘子时,他就可以从上面拿下来,而这之后下面的托盘就会向上一小点(pop)。
类似的,
pushMatrix()
将坐标系的当前状态放在内存区域的最上面,而 popMatrix()
则会将该状态拉回。前面的示例就使用了 pushMatrix()
和
popMatrix()
来确保坐标系在绘图之前的所有地方都已经“清空”了。在所有其他示例中,由于后续没有进行转换,对这两个函数的调用并不是必要的。但是保存、还原坐标系的状态并没有什么不好。所以你最好在做任何转换之前都用一下上述两个函数。还有一个
resetMatrix()
函数(重置矩阵)。它会将矩阵重置到原始的状态(”标识矩阵“),但推入(push)和弹出(pop)函数一般总是比它更好。本文改编自 J David Eisenberg 的 2D Transformations,在 Creative Commons Attribution-NonCommercial-ShareAlike 许可证下使用。