Qt GUI 5.7文档翻译:QTransform类,QTransform Class
QTransform ,用来指定要对坐标系统进行的二维变换。 详细说明……
头文件: |
#include <QTransform> |
qmake指令: |
QT += gui |
自此版本开始引入: |
Qt 4.3 |
QTransform ,用来指定要对坐标系统进行的二维变换。
变换,指定的是,具体要对坐标系统进行什么样的平移(translate)、缩放(scale)、切变(shear)、旋转(rotate)或投影(project),一般是在渲染图像时使用。
QTransform 与QMatrix 不同,它是真正的3x3 矩阵,因而 可以用来进行透视(perspective)变换。 QTransform 的 toAffine ()方法 可用于将 QTransform 转换成QMatrix。如果 在它的矩阵上用到了透视变换,那么,这个转换过程中会丢失数据。
QTransform 是Qt 中建议使用的变换类。
可使用 setMatrix () 、 scale () 、 rotate () 、 translate () 和 shear ()函数来构造出 QTransform 对象。另外 ,也可以通过 基本矩阵操作 来构造。 也可在构造时定义好矩阵, 也可使用函数 reset ()来将矩阵重置成单位矩阵(默认 值 )。
QTransform 类,支持对于图像基本元素的映射:指定 的点、线、多边形、区域或绘图器路径,可使用 map () 函数来映射到由 这个 矩阵定义的坐标系统中。对于矩形 呢,它的坐标,可使用 mapRect ()函数来进行变换。矩形 ,也可以使用 mapToPolygon ()函数来变换成 多边形 (映射 到由 这个 矩阵所定义的坐标系统中 )。
QTransform 提供 了 isIdentity ()函数 ,如果它的矩阵是单位矩阵,则该函数返回真( true )。 还有 isInvertible ()函数,如果它的矩阵是可逆矩阵(non-singular ( 也就是说, AB = BA = I)),就返回真( true )。 inverted ()函数 ,如果 这个 矩阵可逆,则会返回它的逆矩阵(否则 会返回单位矩阵 )。 adjoint ()函数 ,返回该矩阵的经典伴随矩阵(classical adjoint)。另外 , QTransform 还提供了 determinant ()函数,返回 该矩阵的行列式(determinant)。
最后 , QTransform 类还支持矩阵乘法、加法和减法,并且 ,这个类的对象,还可以被序列 化及比较。
在进行图像渲染时,该矩阵定义了要进行的变换操作,但是,实际 的变换动作,是由 QPainter 中的绘图代码来执行的。
默认情况 下, QPainter 会在所关联的绘图设备自身的坐标系统中进行绘图操作。 QPaintDevice 的标准坐标系统,其原点位于左上角。 横坐标 x 向右增长;纵坐标 y 向下增长。 欲了解详细说明,则阅读 坐标系统 文档。
QPainter 自带 了狠多函数,可以在不使用 QTransform 的情况下对坐标系统进行平移、缩放、切变和旋转。例如 :
|
void SimpleTransformation::paintEvent( QPaintEvent *) { QPainter painter(this); painter.setPen( QPen ( Qt ::blue, 1, Qt ::DashLine)); painter.drawRect(0, 0, 100, 100); painter.rotate(45); painter.setFont( QFont ("Helvetica", 24)); painter.setPen( QPen ( Qt ::black, 1)); painter.drawText(20, 10, "QTransform"); } |
尽管 这些函数用起来狠方便,但是,如果妳想进行多个变换操作的话,那么 ,更高效的做法是,构建 一个 QTransform ,然后调用 QPainter::setTransform ()。例如 :
|
void CombinedTransformation::paintEvent( QPaintEvent *) { QPainter painter(this); painter.setPen( QPen ( Qt ::blue, 1, Qt ::DashLine)); painter.drawRect(0, 0, 100, 100); QTransform transform; transform.translate(50, 50); transform.rotate(45); transform.scale(0.5, 1.0); painter.setTransform(transform); painter.setFont( QFont ("Helvetica", 24)); painter.setPen( QPen ( Qt ::black, 1)); painter.drawText(20, 10, "QTransform"); } |
QTransform 对象 中包含着一个3 x 3 矩阵。 m31 ( dx ) 和 m32 ( dy )元素 ,指定了水平方向和竖直方向的平移。 m11 和 m22 元素 ,指定了水平方向和竖直方向的缩放。 m21 和 m12 元素 ,指定了水平方向和竖直方向的 切变 ( shearing )。最后 , m13 和 m23 元素 ,指定了水平方向和竖直方向的投影,同时, m33 是额外的投影因子。
QTransform 使用以下公式来将平面中的某个点变换到另一个点:
x' = m11*x + m21*y + dx
y' = m22*y + m12*x + dy
if (is not affine) {
w' = m13*x + m23*y + m33
x' /= w'
y' /= w'
}
点 (x, y) 即是变换之前的原始点,而 (x', y') 是变换之后的点。 (x', y') 还可以反向变换为 (x, y) ,具体 就是,使用它的逆( inverted ())矩阵来进行相同的操作。
在构造矩阵时,即可设置矩阵中的各个元素,或者 ,也可日后使用 setMatrix ()函数来设置。 也可使用 translate () 、 rotate () 、 scale () 和 shear ()这些便利函数来设置相应的元素。当前 已设置的值,可使用 m11 () 、 m12 () 、 m13 () 、 m21 () 、 m22 () 、 m23 () 、 m31 () 、 m32 () 、 m33 () 、 dx () 和 dy ()函数来获取。
平移, 是最简单的变换。设置 dx 和 dy 两个值,就会, 将坐标系统沿着X 轴的方向移动 dx 个单位,沿着Y 轴的方向移动 dy 个单位。设置 m11 和 m22 即可实现缩放 。例如 , 将 m11 设置为2,将 m22 设置为1.5,这样,就会将高度翻倍,而宽度增长50%。对于单位矩阵, 它的 m11 、 m22 和 m33 都是 1(其它元素 都是 0) ,这样,它会将一个点映射到其自身的位置。切变 ,是通过 m12 和 m21 来控制的。 将这两个元素的值设置为非零值,就会导致坐标系统的扭曲(twist)。旋转 ,是通过同时设置切变因子 和缩放因子来实现的。透视变换 ,是通过同时设置 投影因子 和缩放因子来实现的。
以下是将基本矩阵操作组合起来之后产生的复合变换示例:
|
void BasicOperations::paintEvent( QPaintEvent *) { double pi = 3.14; double a = pi/180 * 45.0; double sina = sin(a); double cosa = cos(a); QTransform translationTransform(1, 0, 0, 1, 50.0, 50.0); QTransform rotationTransform(cosa, sina, -sina, cosa, 0, 0); QTransform scalingTransform(0.5, 0, 0, 1.0, 0, 0); QTransform transform; transform = scalingTransform * rotationTransform * translationTransform; QPainter painter(this); painter.setPen( QPen ( Qt ::blue, 1, Qt ::DashLine)); painter.drawRect(0, 0, 100, 100); painter.setTransform(transform); painter.setFont( QFont ("Helvetica", 24)); painter.setPen( QPen ( Qt ::black, 1)); painter.drawText(20, 10, "QTransform"); } |
参考 QPainter 、 坐标系统 、仿射( Affine )变换示例 和 变换示例 。
如果 这个矩阵表示了某种程度的旋转变换,则返回真( true ),否则返回假( false )。
注意 : 180 度和/或360 度的旋转变换,会被当成是缩放变换。
参考 reset () 。
将坐标系统围绕指定的轴 axis 逆时针旋转指定的角度 angle ,并且返回该矩阵的引用。
注意 ,如果妳向某个定义于部件坐标系中的点应用一个 QTransform 的话,那么,旋转 的方向会是顺时针的,因为, y 轴向下增长。
角度的单位是度。
参考 setMatrix () 。
未知美人
未知美人
未知美人
Your opinionsHxLauncher: Launch Android applications by voice commands