QT座標系統的變化

轉載自http://blog.sina.com.cn/s/blog_6e80f1390100xidr.html

原來座標系是(0,0)X axisY 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’

}

相關(射影幾何學,仿射幾何學,歐式幾何學)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章