Matrix¶
class Matrix()¶
Matrix 在cairo中被广泛的用于不同坐标系统间的转换。一个 Matrix 代表一个仿射变换,例如 缩放、旋转、剪辑(shear)或以上几种的组合。点 (x, y) 的转换通过如下方式给出:
x_new = xx * x + xy * y + x0
y_new = yx * x + yy * y + y0
Context
的当前转换矩阵CTX即 Matrix ,定义了从用户空间坐标到设备空间坐标的转换。
一些标准的Python操作可以被用于矩阵 matrix:
读取矩阵 Matrix 的值:
xx, yx, xy, yy, x0, y0 = matrix
两个矩阵相乘:
matrix3 = matrix1.multiply(matrix2)
# or equivalently
matrix3 = matrix1 * matrix2
比较两个矩阵:
matrix1 == matrix2
matrix1 != matrix2
更多矩阵转换相关的内容请参考 http://www.cairographics.org/matrix_transform (译注,矩阵相关的文章 http://blog.csdn.net/xiaojidan2011/article/details/8213873 )
-
class
cairo.
Matrix
(xx = 1.0, yx = 0.0, xy = 0.0, yy = 1.0, x0 = 0.0, y0 = 0.0)¶ 参数: - xx (float) – 仿射变换的xx组件
- yx (float) – 仿射变换的yx组件
- xy (float) – 仿射变换的xy组件
- yy (float) – 仿射变换的yy组件
- x0 (float) – 仿射变换的X组件
- y0 (float) – 仿射变换的Y组件
使用 xx, yx, xy, yy, x0, y0 定义的仿射变换创建一个矩阵 Matrix 。仿射变换的公式如下:
x_new = xx * x + xy * y + x0 y_new = yx * x + yy * y + y0
创建一个新的独立的矩阵:
matrix = cairo.Matrix()
要创建一个在X和Y轴变换(translates by)tx和ty的矩阵,可以向下面这样:
matrix = cairo.Matrix(x0=tx, y0=ty)
要创建一个在X和Y轴缩放(scale by)tx和ty的矩阵,可以向下面这样:
matrix = cairo.Matrix(xx=sy, yy=sy)
-
classmethod
init_rotate
(radians)¶ 参数: radians (float) – 旋转的角度,单位为弧度。旋转的方向从正X轴到正Y轴为正向的角度。 再考虑到cairo中轴默认的方向,正角度为时钟旋转的方向。 返回: 设置旋转角度为 radians 的新的 Matrix 。
-
invert
()¶ 返回: 如果 Matrix 有逆矩阵(inverse),修改 Matrix 为其逆矩阵并返回None。 Raises: 如果 Matrix 没有逆矩阵触发 cairo.Error
异常。将矩阵 Matrix 转换为其逆矩阵,并不是所有的转换矩阵都有逆矩阵,如果 那么本函数会失败。 (if the matrix collapses points together (it is degenerate), then it has no inverse and this function will fail.)
-
multiply
(matrix2)¶ 参数: matrix2 (cairo.Matrix) – 另一个矩阵 返回: 一个新的 Matrix 两个仿射矩阵 Matrix 和 matrix2 相乘。新矩阵产生的效果为先将第一个矩阵变换 Matrix 作用于坐标再 将第二个矩阵 matrix2 作用于坐标。
结果与 Matrix 或 matrix2 不相同也是可以接受的。
It is allowable for result to be identical to either Matrix or matrix2.
-
rotate
(radians)¶ 参数: radians (float) – 旋转的角度,单位为弧度。旋转的方向从正X轴到正Y轴为正向的角度。 再考虑到cairo中轴默认的方向,正角度为时钟旋转的方向。 初始化 Matrix 为一个旋转 radians 弧度的一个转换。
-
scale
(sx, sy)¶ 参数: - sx (float) – X方向的缩放因子
- sy (float) – Y方向的缩放因子
对 Matrix 中的转换应用 sx, sy 缩放。新的转换的效果为首先以 sx 和 sy 缩放坐标, 然后对坐标应用原来的转换。
-
transform_distance
(dx, dy)¶ 参数: - dx (float) – 空间向量的X组件
- dy (float) – 空间向量的Y组件
返回: 转换后的空间向量 (dx,dy)
返回类型: (float, float)
使用矩阵 Matrix 转换空间向量 (dx,dy) 。其类似于
transform_point()
,但是转换的转换组件被忽略。 (except that the translation components of the transformation are ignored.) 返回的向量是如此计算得出的:dx2 = dx1 * a + dy1 * c dy2 = dx1 * b + dy1 * d
仿射变换是位置不变的,因此相同的向量总是转换为相同的向量。如果 (x1,y1) 转换为 (x2,y2) 那么对于所有的 x1 和 x2 (x1+dx1,y1+dy1) 会转换为 (x1+dx2,y1+dy2) 。
Affine transformations are position invariant, so the same vector always transforms to the same vector. If (x1,y1) transforms to (x2,y2) then (x1+dx1,y1+dy1) will transform to (x1+dx2,y1+dy2) for all values of x1 and x2.
-
transform_point
(x, y)¶ 参数: - x (float) – 点的X坐标
- y (float) – 点的Y坐标
返回: 转换后的点 (x,y)
返回类型: (float, float)
使用 Matrix 转换点 (x, y) 。
-
translate
(tx, ty)¶ 参数: - tx (float) – X方向转换的数量
- ty (float) – Y方向转换的数量
对 Matrix 的转换应用 tx, ty 转换。新的转换的效果为先以 tx 和 ty 转换坐标,再 应用原来的变换。