SharpMap 螢幕座標到世界座標

2021-09-08 21:41:28 字數 1871 閱讀 1736

計算機中有很多座標系,物件座標系、世界座標系、裁剪座標系、螢幕座標系!opengl流水線很容易實現上述順序的轉換。從網上查的資訊:

1. 裝置座標系與螢幕座標系

裝置座標(device coordinate)又稱為物理座標(physical coordinate),是指輸出裝置上的座標。通常將螢幕上的裝置座標稱為螢幕座標。裝置座標用物件距離視窗左上角的水平距離和垂直距離來指定物件的位置,是以畫素為單位來表示的,裝置座標的x軸向右為正,y軸向下為正,座標原點位於視窗的左上角。

2.邏輯座標(logical  coordinate)

是系統用作記錄的座標。在預設的模式(mm_text)下,邏輯座標的方向和單位與裝置座標的方向和單位相同,也是以畫素為單位來表示的,x軸向右為正,y軸向下為正,座標原點位於視窗的左上角。邏輯座標和裝置座標即使在預設模式下其數值也未必一致,除了在以下兩種情況下:    

1.   視窗為非滾動視窗    

2.   視窗為滾動視窗,但垂直滾動條位於滾動邊框的最上端,水平滾動條位於最左端,但如果移動了滾動條這兩種座標就不一致了。

在vc中滑鼠座標的座標位置用裝置座標表示,但所有gdi繪圖都用邏座標表示,所以用滑鼠繪圖時,那麼必須將裝置座標轉換為邏輯座標,可以使用cdc函式dptolp()將裝置座標轉化為邏輯座標,同樣可以用lptodp()將邏輯座標轉化為裝置座標。

3. 道的是如何從螢幕座標系轉換到地理座標系!似乎有難度。

吳立新老師的gis原理與演算法162頁介紹了相關的原理。

如圖:a0為地圖對應的wcs真實世界座標系(地理座標系),b0為裝置座標系中顯示的地圖(螢幕座標或者更常見的為檢視區的座標)。地圖在從世界座標轉換到螢幕座標的時候通常需要進行變換。設a0的左下角座標wl(wxl,wyl),右上角座標wb(wxb,wyb),對於每個裝置左上點vl(vxl,vyl),右上角點vb(vxb,vyb),地圖中任意一點a座標(xw,yw),對應裝置座標(vx,vy)。地圖的中心點o對應於螢幕上的o』點,o點座標容易計算。這樣實際確定了乙個比例尺δ(地圖在放入裝置顯示的時候縱橫比例不變,即橫向比例和縱向比例相同):該比例尺的值等於b0螢幕尺寸與a0實際地圖尺寸的比值。記a0---->b0地圖對映為f1。

由a點計算a』點座標:首先計算a點到wl點的wcs座標差,再用座標差除以每個畫素代表的實際wcs寬度(δ的倒數),即得到畫素座標。

由a』點計算a點座標:以wl點的wcs座標+a』點螢幕座標*每個畫素代表的實際wcs寬度(δ的倒數)。

因為要考慮地圖的無級縮放,吳老師書中的公式只是介紹了地圖繪製全部過程的一部分,或者說是說明的不夠詳細。地圖的縮放也就是依據比例尺進行顯示的問題。在螢幕上以o點為中心放大地圖,螢幕中顯示的地圖從b0變為b1在紅色框中顯示的部分,此時在計算機看來存在乙個地圖b1,應該與a0的放大地圖a1對應。這個放大過程實際上改變了畫素代表的wcs寬度。sharpmap中以o點座標為基礎,按照新的畫素寬度重新計算落b1對應的螢幕座標。即在計算螢幕座標對應的wcs座標時首先通過中心點o』對應的o座標來計算wl座標,當然sharpmap這樣處理也導致了他只能實現中心放大,這是個問題。再看看sharpmap專案的方法:首先map物件有乙個zoom屬性,表示map對應於wcs世界座標系中的寬度。pixelsize屬性等於zoom/顯示檢視的尺寸。

圖a1和b1都是抽象出來的地圖,並不能與現實世界對應起來。

仔細考慮一下覺得這些問題似乎用矩陣來解釋更加合理簡單。比如地圖放大縮小;螢幕窗體顯示部分地圖,窗體可否視為乙個標架,固定一點(sharpmap中是o點)+每個畫素代表的實際wcs寬度(δ的倒數)?後續的學習中要補充這部分內容的矩陣解釋!

乙個問題:線性系統及滿足齊次性和疊加性的系統。線性代數研究的是線性系統?矩陣能用於非線性系統嗎?計算機圖形學的流水線都用到矩陣是否是線性系統?

螢幕座標到opengl世界座標轉換

很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,pos...

螢幕座標到opengl世界座標轉換

很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,pos...

Unity 本地座標到世界座標,世界座標到本地座標

世界 本地 public gameobject mtarget public gameobject mpar 這個注意一定要是mtarget的第一父物體。use this for initialization void start world mtarget.transform.localposit...