實例: 以點(100,100) 圍繞點(200,150)旋轉45°后的坐標, 采用QTransform 類方法實現移動變換.
Test1
采用一個QTransform 對象,通過連續的變換后,發現最后的結果與預先的不一致.
原因:
當trans1.translate(-200., -150.); 后,坐標系的原點變成了-200,-150.
之后trans1.rotate(45.); 將以(-200,-150)為原點,旋轉坐標系45°.
trans1.translate(200., 150.); ,將在旋轉后的坐標系下面, X軸方向偏移200,Y軸偏置150.
Test2
正確的方式:
采用多個QTransform 對象,保證每個變換對象的初始原點坐標始終是(0,0).
最后通過了將每個變換* 得到一個總的變換矩陣.
也可以單獨一步一步的變換后,將上一步的結果作為下一步的輸入點.
#include <QtCore/QCoreApplication>
#include <QTransform>
#include <QRectF>
#include <QDebug>
#include <QRegion>void Test1()
{qInfo() << "Test1";QPointF point(100., 100.);QTransform trans1;qInfo() << "trans1:" << trans1;trans1.translate(-200., -150.);qInfo() << "trans1:" << trans1;QPointF point1 = trans1.map(point);qInfo() << point1;trans1.rotate(45.);qInfo() << "trans1:" << trans1;QPointF point2 = trans1.map(point);qInfo() << point2;trans1.translate(200., 150.);qInfo() << "trans1:" << trans1;QPointF point3 = trans1.map(point);qInfo() << "Test2" << point3;
}void Test2()
{qInfo() << "Test2";QPointF point(100., 100.);QTransform trans1;qInfo() << "trans1:" << trans1;trans1.translate(-200., -150.);qInfo() << "trans1:" << trans1;QPointF point1 = trans1.map(point);qInfo() << point1;QTransform trans2;qInfo() << "trans2:" << trans2;trans2.rotate(45.);qInfo() << "trans2:" << trans2;QPointF point2 = trans2.map(point1);qInfo() << point2;QTransform trans3;qInfo() << "trans3:" << trans3;trans3.translate(200., 150.);qInfo() << "trans3:" << trans3;QPointF point3 = trans3.map(point2);qInfo() << "Test2" << point3;//方式二// Combine the transformations using chainingQTransform finalTransform = trans1 * trans2 * trans3;qInfo() << "finalTransform:" << finalTransform;QPointF point4 = finalTransform.map(point);qInfo() << "Test2" << point4;}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Test1();Test2();return a.exec();
}
結果
Test1
trans1: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans1: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=-200 32=-150 33=1)
QPointF(-100,-50)
trans1: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=-200 32=-150 33=1)
QPointF(-200,-8.57864)
trans1: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=-164.645 32=97.4874 33=1)
Test2 QPointF(-164.645,238.909)
Test2
trans1: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans1: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=-200 32=-150 33=1)
QPointF(-100,-50)
trans2: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans2: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=0 32=0 33=1)
QPointF(-35.3553,-106.066)
trans3: QTransform(type=TxNone, 11=1 12=0 13=0 21=0 22=1 23=0 31=0 32=0 33=1)
trans3: QTransform(type=TxTranslate, 11=1 12=0 13=0 21=0 22=1 23=0 31=200 32=150 33=1)
Test2 QPointF(164.645,43.934)
finalTransform: QTransform(type=TxRotate, 11=0.707107 12=0.707107 13=0 21=-0.707107 22=0.707107 23=0 31=164.645 32=-97.4874 33=1)
Test2 QPointF(164.645,43.934)