Qt學習之路 28 座標變換

2021-08-25 07:48:40 字數 2705 閱讀 2535

原始出處 、作者資訊和本宣告。否則將追究法律責任。

經過前面的章節,我們已經能夠畫出一些東西來,主要就是使用qpainter的相關函式。今天,我們要看的是qpainter的座標系統。

同很多座標系統一樣,qpainter的預設座標的原點(0, 0)位於螢幕的左上角,x軸正方向是水平向右,y軸正方向是豎直向下。在這個座標系統中,每個畫素佔據1 x 1的空間。你可以把它想象成是一張座標值,其中的每個小格都是1個畫素。這麼說來,乙個畫素的中心實際上是乙個「半畫素座標系」,也就是說,畫素(x, y)的中心位置其實是在(x + 0.5, y + 0.5)的位置上。因此,如果我們使用qpainter在(100, 100)處繪製乙個畫素,那麼,這個畫素的中心座標是(100.5, 100.5)。

這種細微的差別在實際應用中,特別是對座標要求精確的系統中是很重要的。首先,只有在禁止反走樣,也就是預設狀態下,才會有這0.5畫素的偏 移;如果使用了反走樣,那麼,我們畫(100, 100)位置的畫素時,qpainter會在(99.5, 99.5),(99.5, 100.5),(100.5, 99.5)和(100.5, 100.5)四個位置繪製乙個亮色的畫素,這麼產生的效果就是在這四個畫素的焦點處(100, 100)產生了乙個畫素。如果不需要這個特性,就需要將qpainter的座標系平移(0.5, 0.5)。

這一特性在繪製直線、矩形等圖形的時候都會用到。下圖給出了在沒有反走樣技術時,使用drawrect(2, 2, 6, 5)繪製乙個矩形的示例。在no pen的情況下,請注意矩形左上角的畫素是在(2, 2),其中心位置是在(2.5, 2.5)的位置。然後注意下有不同的pen的值的繪製樣式,在pen寬為1時,實際畫出的矩形的面積是7 x 6的(圖出自c++ gui programming with qt4, 2nd edition):

在具有反走樣時,使用drawrect(2, 2, 6, 5)的效果如下(圖出自c++ gui programming with qt4, 2nd edition):

注意我們前面說過,通過平移qpainter的座標系來消除著0.5畫素的差異。下面給出了使用drawrect(2.5, 2.5, 6, 5)在反走樣情況下繪製的矩形(圖出自c++ gui programming with qt4, 2nd edition):

請對比與上圖的區別。

在上述的qpainter的預設座標系下,qpainter提供了視口(viewport)視窗(window)機制,用於繪製與繪製裝置的大 小和解析度無關的圖形。視口和視窗是緊密的聯絡在一起的,它們一般都是矩形。視口是由物理座標確定其大小,而視窗則是由邏輯座標決定。我們在使用 qpainter進行繪製時,傳給qpainter的是邏輯座標,然後,qt的繪圖機制會使用座標變換將邏輯座標轉換成物理座標後進行繪製。

通常,視口和視窗的座標是一致的。比如乙個600 x 800的widget(這是乙個widget,或許是乙個對話方塊,或許是乙個面板等等),預設情況下,視口和視窗都是乙個320 x 200的矩形,原點都在(0, 0),此時,視口和視窗的座標是相同的。

注意到qpainter提供了setwindow()和setviewport()函式,用來設定視口和視窗的矩形大小。比如,在上面所述的 320 x 200的widget中,我們要設定乙個從(-50, -50)到(+50, +50),原點在中心的矩形視窗,就可以使用

其中,(-50, -50)指明了原點,100, 100指明了視窗的長和寬。這裡的「指明原點」意思是,邏輯座標的(-50, -50)對應著物理座標的(0, 0);「長和寬」說明,邏輯座標系下的長100,寬100實際上對應物理座標系的長320,寬200。

或許你已經發現這麼乙個好處,我們可以隨時改變window的範圍,而不改變底層物理座標系。這就是前面所說的,視口與視窗的作用:「繪製與繪 制裝置的大小和解析度無關的圖形」,如下圖所示(圖出自c++ gui programming with qt4, 2nd edition):

除了視口與視窗的變化,qpainter還提供了乙個「世界座標系」,同樣也可以變換圖形。所不同的是,視口與視窗實際上是統一圖形在兩個座標系下的表達,而世界座標系的變換是通過改變座標系來平移、縮放、旋轉、剪下圖形。為了清楚起見,我們來看下面乙個例子:

event )

為了顯示方便,我在這裡使用了qfont改變了字型。qpainter的drawtext()函式提供了繪製文字的功能。它有幾種過載形式,我們使用了其中的一種,即制定文字的座標然後繪製。需要注意的是,這裡的座標是文字

我們使用qtransform做了乙個rotate變換。這個變換就是旋轉,而且是順時針旋轉45度。然後我們使用這個變換設定了 qpainter的世界座標系,注意到qpainter是乙個狀態機,所以這種變換並不會改變之前的狀態,因此只有第二個hello, world!被旋轉了。確切的說,被旋轉的是座標系而不是這個文字!請注意體會這兩種說法的不同。

本文出自 「豆子空間 」 部落格,請務必保留此出處

Qt學習之路 28 座標變換

經過前面的章節,我們已經能夠畫出一些東西來,主要就是使用qpainter的相關函式。今天,我們要看的是qpainter的座標系統。同很多座標系統一樣,qpainter的預設座標的原點 0,0 位於螢幕的左上角,x軸正方向是水平向右,y軸正方向是豎直向下。在這個座標系統中,每個畫素佔據1 x 1的空間...

Qt學習之路 28 座標變換

經過前面的章節,我們已經能夠畫出一些東西來,主要就是使用qpainter的相關函式。今天,我們要看的是qpainter的座標系統。同很多座標系統一樣,qpainter的預設座標的原點 0,0 位於螢幕的左上角,x軸正方向是水平向右,y軸正方向是豎直向下。在這個座標系統中,每個畫素佔據1 x 1的空間...

Qt學習之路 28 座標變換

經過前面的章節,我們已經能夠畫出一些東西來,主要就是使用qpainter的相關函式。今天,我們要看的是qpainter的座標系統。同很多座標系統一樣,qpainter的預設座標的原點 0,0 位於螢幕的左上角,x軸正方向是水平向右,y軸正方向是豎直向下。在這個座標系統中,每個畫素佔據1 x 1的空間...