從視窗到視口的對映

2021-06-20 06:21:33 字數 2803 閱讀 7203

從視窗到視口的對映

高中時我們學過垂直座標系和極座標系,同乙個點在不同的座標系裡的座標值是不一樣的,比如垂直座標系裡的(1, 1)

這個點,對應的極座標卻是(

1.414, 45

)。這兩個座標值可以通過一定的計算公式相互轉換。我們把這裡的垂直座標系稱為「邏輯座標系」,其座標值只是乙個數值,是沒有物理單位的,每乙個邏輯單位可以代表

1mm,也可以代表

1m,還可以代表

1個畫素或者

1/12

英吋。這個跟具體的物理裝置有關。

這裡我們再定義乙個新的座標系,其x

軸方向、

y軸方向、

x軸刻度和

y軸刻度都和邏輯座標系相同。我們把這個座標系稱為「裝置座標系」。如圖

1所示:

圖1 邏輯座標系與裝置座標系

這樣,同乙個座標值在不同的裝置座標系裡,可以對應不同的點,它們之間存在一種對映關係。比如邏輯座標系中的a

點(1,1)

,可以對映到裝置座標系的a』

(1,1)。

圖2 點對映

同理,邏輯座標系裡的乙個矩形abcd

也可以對映到裝置座標系裡的矩形a』

b』c』

d』。

圖3 矩形對映

這種對映都很簡單。現在,我想把邏輯座標系裡的矩形abcd

對映到裝置座標系裡的a」

b」c」

d」,如圖4

所示,可不可以呢?

圖4 矩形對映2

當然可以,也很簡單,只需要把裝置座標系裡的對映圖形平移一下就可以了。怎麼平移呢?只需要把裝置座標系裡的原點平移到現在的a

」位置。現在,我們以a

」為原點,再作乙個輔助座標系,如圖5

所示。這時,邏輯座標系裡的原點就對映到裝置座標系裡的輔助座標系的原點。

圖5 裝置座標系中的輔助座標系

同理,我們也可以平移邏輯座標系裡的原點,在邏輯座標系裡也作乙個輔助座標系。平移之後的對映效果如圖6

所示。可見,在平移之後,邏輯座標系新的座標原點對映到裝置座標系新的座標原點。

圖6 平移邏輯座標系的原點

現在,我們把邏輯座標系裡的輔助座標系稱為「視窗」,把裝置座標系裡的輔助座標系稱為「視口」。把平移邏輯座標系原點的操作稱為setwindoworg()

,把平移裝置座標系原點的操作稱為

setviewportorg()

。這兩個函式的引數都是以各自原來的座標係為基準的。比如,圖中平移視窗原點應該呼叫

setwindoworg (1.5

, - 1.8)

,而平移視口原點應該是

setviewportorg(1

,1)。平移之後,原座標系的零點並不變,改變的只是視窗或者視口的原點(相當於輔助座標系的零點)。

所有的對映都是從視窗對映到視口。上述的對映方式很簡單。下面介紹一種新的座標系,其x

軸方向依然向右,但

y軸方向卻是向下,每乙個邏輯單位代表乙個畫素。這就是「螢幕座標系」,我們把從邏輯座標系對映到螢幕座標系的對映方式稱為「

mm_text

」。圖7 

螢幕座標系

我們知道,邏輯座標系是無窮大的,想在**繪圖就可以在**繪圖,但是顯示裝置(比如螢幕,在應用程式中是客戶區)大小卻是有限的。現在,我要在邏輯座標系裡畫乙個2000*2000

大小的矩形,對映到螢幕上就是乙個

2000

畫素*2000

畫素的乙個矩形。但是,應用程式的客戶區並沒有那麼大,只能顯示矩形的一部分。顯示哪一部分呢?在

windows

程式中,客戶區的左上角始終對應裝置座標系的零點,顯示區域是第一象限,這個是不能改變的。這時,客戶區只能顯示矩形的左上角部分。怎樣才能顯示矩形的其他部分呢?只需要把矩形移動一下。這就好比用放大鏡看報紙,放大鏡不動,只移動報紙就可以看到報紙上的所有內容了。

圖8 視口與客戶區的關係

(圖中的「螢幕」指的是客戶區)

那怎麼樣移動矩形呢?移動視口的原點就可以了。預設情況下,視口原點和裝置座標系的原點是重合的,把視口的原點移到(-1000, -1000)

的位置,就可以看到矩形的右下角部分了。

當然,移動視窗的原點也是可以的。因為在邏輯座標系裡作圖時,圖形的邏輯位置不變,當視窗的原點移動時,圖形與視窗原點的相對位置也就發生了改變,對映後視口中的圖形與視口原點的相對位置也會相應的發生改變。如圖10

,把視窗原點移動到

(1000,1000)

後,矩形的中心會對映到視口的零點,即客戶區的左上角。

邏輯座標系

裝置座標系(螢幕)

圖10 

移動視窗原點

剛才我們在邏輯座標系裡畫了乙個2000*2000

大小的矩形,顯示在螢幕上的矩形長

2000

畫素,寬也是

2000

畫素。這樣,在不同大小的顯示器上,由於畫素間距不同,所以實際大小也不同。並且,有的顯示器畫素的水平間距和垂直間距也不同,這時畫的本來是個正方形,但顯示出來卻變成了長方形!這時,可以使用

mm_lometric

對映模式,保證所畫的每乙個邏輯單位長度對應

0.1mm

。在不同的顯示器上顯示時,它會根據自己的點距來調整。

視口和視窗

對映方式指定了邏輯座標系的邏輯單位和座標軸正方向,座標原點沒有涉及。而且,在 自作主張的 兩種對映方式下,邏輯單位 座標軸正方向和座標原點都有待確定。視口 是基於裝置座標的,通常,視口與客戶區相同。點 0,0 是客戶區域的左上角。x 的值向右增加,y 的值向下增加。視窗 是基於邏輯座標的,邏輯座標可...

視窗與視口

幾個概念容易亂,先寫下來 一般來說,客戶區左上角的點對應視口原點 0,0 我理解他們為等同關係.裝置區 0,0 點就是視口原點 0,0 點,且不可改變.視窗座標應用中使用邏輯座標,偶理解為視窗原點就是邏輯原點.等同關係.且可以改變.下面可能用上.不要理解為整個視窗的左上角那個點 從理解應用來說,無論...

html響應式設計視口 視窗視口

關於視口 視口在響應式設計中是乙個非常重要的概念,在移動端瀏覽器中存在兩種視口 一是可見視口,即裝置大小 另外一種是視窗視口,即網頁寬度。裝置螢幕是414pxd 寬度,在瀏覽器中,414px的螢幕能夠顯示1200px 的內容。那麼,414px 就是可見視口的寬度,而1200px 就是視窗視口的寬度。...