在 PyCairo 图形学编程教程的这个部分,我们将讨论变换。
一个 仿射变换 由 0 个或多个线性变换(旋转,放缩或切变)和平移(移位)组成。多个线性变换可以结合为以单个矩阵表示。 旋转 是将一个刚体围绕一个固定点移动的变换。放缩 是放大或缩小对象的变换。放缩系数在所有方向上都是相同的。平移 是在特定的方向上,将每个点都移动固定距离的变换。切变 是将物体垂直于给定轴移动,同时保持轴的一侧的值比另一侧的值大的变换。
是一个将一个对象正交的移动向给定的轴,同时保持轴某一侧的值比另一侧更大的变换。
来源: (wikipedia.org,freedictionary.com)
平移
下面的例子描述了一个简单的平移。
|
|
这个例子先绘制了一个矩形。然后我们做平移,并多次绘制相同的矩形。
|
|
translate()
函数通过平移用户空间原点修改当前的变换矩阵。在我们的例子中,我们在两个方向上将原点移动 20 个单位。
切变
在下面的例子中,我们执行一个切变操作。切变是沿着一个特定的轴的物体变形。这个操作没有切变方法。我们需要创建我们自己的变换矩阵。注意,每个仿射变换都可以通过创建变换矩阵来执行。
|
|
在这段代码中,我们执行一个简单的切变操作。
|
|
这个变换将 y 值切变为 x 值的 0.5 倍。
|
|
我们通过 transform()
方法执行变换。
放缩
下一个例子演示放缩操作。放缩是将对象放大或缩小的变换操作。
|
|
我们绘制三个 90 × 90 px 大小的矩形。对于其中的 2 个,我们执行放缩操作。
|
|
我们均匀地用系数 0.6 缩小矩形。
|
|
这里我们用系数 0.8 执行另一个放缩操作。如果我们查看图片,我们将看到,第三个黄色矩形是最小的。即使我们已经使用了另一个更小的放缩因子。这是由于变换操作是累积的。事实上,第三个矩形是由放缩因子 0.528 (0.6 ×0.8) 来放缩的。
隔离变换
变换操作是累积的。为了隔离各个操作,我们可以使用 save()
和 restore()
方法。save()
方法创建一份绘制上下文当前状态的拷贝,并将它存进一个保存状态的内部栈中。restore()
方法将重建上下文为保存的状态。
|
|
这个例子中我们放缩两个矩形。这次我们隔离各个放缩操作。
|
|
我们通过将 scale()
方法放到 save()
和 restore()
方法之间来隔离放缩操作。
现在第三个黄色矩形比第二个红色的大。
甜甜圈
在下面的例子中,我们通过旋转一束椭圆创建一个复杂的形状。
|
|
我们将执行旋转和放缩操作。我们也将保存和恢复 PyCairo 上下文。
|
|
在 GTK 窗口中间,我们创建一个圆形。这将是我们的椭圆形的边界圆形。
|
|
我们沿着我们的边界圆形路径创建 36 个椭圆形。我们通过save()
和 restore()
方法,将各个旋转和放缩操作隔离开。
星形
下一个例子展示一个旋转和放缩的星形。
|
|
在这个例子中,我们创建一个星形对象。我们将平移它,旋转它并放缩它。
|
|
星形对象将从这些点创建。
|
|
在 init_vars()
方法中,我们初始化三个变量。self.angle
被用于旋转,self.scale
被用于放缩星形对象。self.delta
变量控制何时星形不断放大而何时又不断缩小。
|
|
每隔 cv.SPEED
ms,on_timer()
方法会被调用。
|
|
这几行控制星形是逐渐变大还是变小。
|
|
我们将星形移动到窗口的中心。旋转并放缩它。
|
|
我们在这里绘制星形对象。
在 PyCairo 教程的这个部分,我们讨论了变换。
Done.