轉載自http://blog.sina.com.cn/s/blog_6e80f1390100xidr.html
原來座標系是(0,0)X axis右Y axis下
現在想把它變成,座標在窗口中間,X右,Y上,標準的數學中的座標系。
Painter.setWindow(x,y,width().height());
用setWindow這個函數,表示什麼意思。前兩個參數左上角位置,後兩個參數寬高。
這個是原本的座標系,要把他變成下面這個
怎麼算呢,可以把變換好的座標系在紙上畫出來,左上角座標傳給前兩個參數,後兩個參數寬高可以算出來。
Width= 50-(-50) = 100;
Height = -50-50 = -100;
那麼就是painter.setWindow(-50,50,100,-100);
一般painter.setWindow(-width()/2,height()/2,width(),-height());就可以達到目的了
World Corrdinates |
===> |
Window Coordinates |
===> |
Device Coordinates |
(邏輯座標) |
世界變換 |
中間態座標 |
窗口視口變換 |
(物理座標) |
在默認情況下,3個座標系是一致的。
世界變換
世界變換直接相關的函數:
Qpainter::setWorldMatrixEnabled |
啓用,禁用世界變換 |
Qpainter:;setWorldTransform |
設置世界變換 |
Qpainter::worldTransform |
獲取當前 |
Qpainter::resetTransform |
重置Qtransform() |
4個常用的函數:Qpainter::scale Qpainter::shear Qpainter::rotate Qpainter::translate
注:它們通過直接調用的Qtransform的相應成員直接修改世界變換
Void Qpainter::scale(qreal sx,qreal sy)
{
......
d->state->worldMatrix.scale(sx,sy);
.......
}
世界變換的兩個馬甲:Qpainter::setTransform Qpainter::transform
Void Qpainter::setTransform(const Qtransfrom &transform,bool combine)
{
setWorldTransform(transform,combine);
}
廢棄的函數(從Qt4.3開始,Qtransform取代了Qmatrix的位置,下列函數已不建議使用):
Qpainter::setWorldMatrix Qpainter::worldMatrix
窗口視口變換
直接相關:
Qpainter::setViewTransformEnabled |
啓用,禁用視口變換 |
Qpainter::viewTransformEnabled |
|
Qpainter::setViewport |
設置 視口(物理座標) |
Qpainter::setWindow |
設置 窗口(與視口是同一矩形,中間太座標) |
該變換是簡單的線性變換。
複合變換
窗口視口變換和世界變換的複合:Qpainter::combinedTransform
Qtransform Qpainter::combinedTransform() const
{
Q_D(const QPainter);
Return d->state->worldMatrix* d->viewTransform();
}
典型應用:對鼠標事件的響應中,講座標從物理座標變換Qpainter需要的邏輯座標
仿射變換、透射變換
Qt4.3(包括)之前的Qmatrix只支持仿射變換(Affine transformation)
平移(Translation) 縮放(Scale) 旋轉(Rotation) 剪切(Shear)
Qtransform支持透射變換(perspective transformation).
M11 |
M12 |
M13 |
M21 |
M22 |
M23 |
M31 dx |
M32 dy |
M33 |
變換關係:
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’
}
相關(射影幾何學,仿射幾何學,歐式幾何學)