Windows GDI中的座標系 一

2021-08-21 22:44:50 字數 2643 閱讀 1882

windows gdi中的座標系(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

by leezy_2000

2003-10-21 16:13

如果你用gdi輸出過文字、位圖、或者繪製過如直線、曲線的圖形,那麼你必然使用過座標系。螢幕解析度為96dpi(dot per inch),印表機的解析度通常為600dpi,而你使用如

moveto(hdc,100,100);

lineto(hdc,1300,1300);

在兩者之上卻可能生成完全相同的兩條線(此即所見即所得wysiwyg)。就實現原理而言,座標繫在其中扮演著決定性的角色。

一、什麼是gdi座標系?

首先從數學的角度看,gdi座標系是二維笛卡爾座標系,通過兩條軸和原點就可以確定平面上任何一點的位置。

從使用的角度看,gdi座標系是一種轉換規則,把你所制定的邏輯資料轉換成最終裝置驅動所能使用的資料。比如(100,100)這一點,經過實際的變換,在96dpi的螢幕上就可能是(9.6,9.6),在600dpi的印表機上則可能是(60,60)。(註一)

gdi座標系由四層座標空間組成(註二),按層次的高低分別為:

世界座標空間(world-space):支援affine變換,應用於下面所說的頁面座標空間之上,只在nt類作業系統中有支援。

頁面座標空間(page-space):支援大量預定義的對映模式,是必然會被使用的座標空間。原點和相應的縮放比率的設定適合在頁面座標空間中進行設定。

世界座標空間和頁面座標空間統稱為邏輯座標空間,是gdi使用者所能夠直接使用的座標空間。也就是說進行gdi輸出時,你所指定的位置、大小等資訊只能是相對於邏輯座標空間的資料。

裝置座標空間(device-space):同裝置上下文相關聯的裝置空間。可以表示物理裝置的一小塊或者整個物理裝置。由於各種gdi輸出是面向裝置上下文的,邏輯座標空間中的相關資料自然也就必須要轉化為裝置座標空間中的資料。

物理裝置座標空間(physical-device space):圖形裝置的物理表面的部分或全部。也就是圖形驅動程式所使用的座標空間。任何gdi輸出最終想在顯示器或印表機上成形都要經過相關的驅動程式,進行裝置座標空間向物理裝置座標空間的轉換就成為一種必然。這個過程完全由系統完成。所以dc的原點和大小資訊是唯讀的。(為表述方便以下將用dc表示裝置上下文)

二、輸出位置到底在那兒?

由上述說明可見最終輸出位置的確定至少要經2次變換(如果你啟用了世界座標空間那是3次),有沒有什麼辦法能夠直接確定任意乙個邏輯點最終會對應到那個物理位置呢?現成的沒有,我們來自己實現乙個,其實也並不複雜。首先要把邏輯座標轉化為裝置座標,這個過程要根據affine矩陣和當前對映模式做很多運算,但我們現在先不自己進行這種運算,而是使用

bool lptodp(

hdchdc

,// handle to device context

lppointlppoints

,// array of points

intncount

// count of points in array

);

這個函式負責把lppoints

中的邏輯座標轉換為同hdc相關聯的裝置座標。(稍後我們來自己完成這個函式)。

因為裝置座標和物理裝置座標的單位是一致的,都是物理裝置點。所以從裝置座標到物理裝置座標的轉換沒那麼麻煩,只要知道了dc的原點就可以了(注意這裡的原點是指裝置座標空間的原點在物理裝置座標空間中的位置)。這個任務的本質是去讀取os的dc結構,我們使用

bool getdcorgex(

hdchdc

,// handle to a dc

lppointlppoint

// translation origin

);
來完成這一任務。

這樣的話,對於任意邏輯點logicalpoint,其dc原點為dcorgpoint有:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

physicaldevicepoint就是logicalpoint理論上在物理裝置座標空間中的位置。此處需要說明的是由於物理裝置座標空間並不一定涵蓋圖形裝置的整個物理表面,所以從physicaldevicepoint計算出的位置並不一定就是物理表面上的位置。比如說列印的時候就還要加上四周的不可列印區域才是其實際位置。同時顯示器一類的裝置還要考慮物理裝置本身有沒有進行縮放,如果沒有(也就是說沒用顯示器下邊的那些鈕)那麼你就會發現我們計算出的尺寸同相應點在螢幕上的位置符合的挺好。

void getphysicalposition(hdc hdc,lppoint lppoint ,int ncount)用於完成上述功能。具體實現見原始碼1。

Windows GDI中的座標系 二

windows gdi中的座標系 二 by leezy 2000 2003 10 21 16 13 一 邏輯空間的座標是如何轉化為裝置空間的座標的?讓我們先來澄清邏輯座標空間內部是如何轉化的。世界座標空間到頁面座標空間的變換 二維affine 註三 變換 此過程中涉及到的各種變換,比如 相等 平移 ...

大地座標系 地理座標系 投影座標系

大地座標系 是大地測量中以參考橢球面為基準面建立起來的座標系。地面點的位置用 大地經度 大地緯度和大地高度 表示。大地座標系的確立包括選擇乙個橢球 對橢球進行定位和確定大地起算資料。乙個形狀 大小和定位 定向都已確定的地球橢球叫參考橢球。參考橢球一旦確定,則標誌著大地座標系已經建立。大地座標系是一種...

gazebo中的座標系

1 gazebo中link和joint中都有origin的元素。弄了半天好像是明白了。link定義了各個部件的幾何模型,joint定義了各幾何模型直接的座標位置。joint中的origin就是這種連線關係建立的座標系的原點和朝向。比如,就是在世界座標系的 1,0,1 這個點建立了乙個子座標系。而li...