StupidBeauty
Read times:3847Posted at: - no title specified

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 )变换示例 变换示例

成员函数文档

bool QTransform::isRotating() const

如果 这个矩阵表示了某种程度的旋转变换,则返回真( true ),否则返回假( false )。

注意 180 度和/或360 度的旋转变换,会被当成是缩放变换。

参考 reset ()

QTransform  &QTransform:: rotate ( qreal angle Qt::Axis axis  = Qt::ZAxis)

将坐标系统围绕指定的轴 axis 逆时针旋转指定的角度 angle ,并且返回该矩阵的引用。

注意 ,如果妳向某个定义于部件坐标系中的点应用一个 QTransform 的话,那么,旋转 的方向会是顺时针的,因为, y 轴向下增长。

角度的单位是度。

参考 setMatrix ()

未知美人

未知美人

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands