QTransform類
QTransform類用於控制二維座標系之間的轉換
包含:位移、縮放、扭曲、旋轉還有映射
首先看它的核心內容:
這是一個仿射變換矩陣(affine transformation),它包含了座標系轉換所需要的所有信息
element | description |
---|---|
m11 | 水平縮放 |
m22 | 垂直縮放 |
m21 | 水平扭曲 |
m12 | 垂直扭曲 |
m31(dx) | 水平位移 |
m32(dy) | 垂直位移 |
m13 | 水平映射 |
m23 | 垂直映射 |
m33 | 額外的映射因子 |
他們具體的功能可以看下圖:
你可以直接使用
void setMatrix(qreal m11, qreal m12, qreal m13,
qreal m21, qreal m22, qreal m23,
qreal m31, qreal m32, qreal m33)
來設置這些元素
當然,QTransform也提供了很多方法來方便你使用
method | descripiton |
QTransform.translate(qreal dx, qreal dy) | dx,dy爲任意大小的實數,保存到m31(dx)和m32(dy)中 |
QTransform.scale(qreal sx, qreal sy) | sx,sy爲任意大小的實數,保存到m11和m22中 |
QTransform.rotate(qreal angle) | angle爲任意大小的實數,不過爲了便於閱讀,最好是0到360之間 |
QTransform.shear(qreal sh, qreal sv) | sh,sv爲任意大小的實數,保存到m12和m21中 |
基礎操作
平移
translate() 可將座標原點變更爲指定的座標點 (x, y)。
這裏,將座標原點由 (0, 0) 變爲 (120, 20)。
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
旋轉
rotate() 使用角度技巧表示遠近。設置第二個參數爲角度的常量值後,可以使用 X 軸、Y 軸、Z 軸技巧。它默認是以原點爲中心進行旋轉的,如果要改變旋轉的中心,可以使用 translate() 函數完成。
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
// 旋轉
transform.rotate(45, Qt::XAxis);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
縮放
scale() 可以進行縮放。
這裏,使繪製的圖像縮小到原來的一半。
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 平移
transform.translate(120, 20);
// 旋轉
transform.rotate(45);
// 縮放
transform.scale(0.5, 0.5);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
扭曲(錯切變換)
shear() 可以實現圖片的扭曲。它有兩個參數,前面的參數實現橫向變形,後面的參數實現縱向變形。當它們的值爲 0 時,表示不扭曲。
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
// 反走樣
painter.setRenderHint(QPainter::Antialiasing, true);
QTransform transform;
// 橫向扭曲
transform.shear(0.5, 0);
painter.setTransform(transform);
painter.drawPixmap(QRect(0, 0, 150, 150), QPixmap(":/Images/logo"));
}
假設(w, z)爲原始輸入空間,(x, y)爲變換後的座標空間。
水平方向
- 仿射矩陣爲
- 座標變換等式爲
反方向類似。