GMT6.0三維繪圖:坐標旋轉(zhuǎn)原理

前期一篇文章:Modern GMT Series:Slice in 3D View (三維切片圖)
中指出了當前GMT官方版本中的三維顯示問題存在漏洞,下面將一步一步說明如何修復這個漏洞。

GMT繪圖過程其實是將一系列的繪圖命令經(jīng)過一定的計算寫為PostScript文件,然后就可以將PS文件轉(zhuǎn)換為其他的各種格式,比如pdf, png等。而在PostScript中是支持三維旋轉(zhuǎn)的,類似下面這樣的格式

PSL_GPP setmatrix
/PSL_GPP matrix currentmatrix def [0.71934 -0.347329 0 0.866025 0 820.463] concat

要修復此漏洞,首先必須明白兩個問題:(1)PostScript中是如何實現(xiàn)三維顯示(坐標旋轉(zhuǎn)等)的;(2)GMT中是如何計算相應(yīng)的旋轉(zhuǎn)參數(shù)的。了解了這兩個問題之后,問題便會迎刃而解!

PostScript的三維坐標問題[1]

幾個重要的概念

  1. 物理坐標系:適應(yīng)于繪圖的物理設(shè)備,比如windows計算機的繪圖原點一般在左下角;但是在Unix系統(tǒng)里面,這個坐標原點一般在左上角。物理坐標系里面的基本長度單位是一個像素的寬度和高度。

  2. 紙張坐標系:坐標原點在紙張的左下角,長度單位是一個Adobe點(1/72英尺)

  3. 用戶坐標系:也就是繪制目標圖形(繪圖問題)的坐標系。繪圖過程中,用戶坐標系與紙張坐標系相同,但是可以使用scale,translate,rotate函數(shù)來改變兩者的聯(lián)系。

PostScript(下面用PS表示)內(nèi)置函數(shù)(公式)可以實現(xiàn)用戶坐標系到物理坐標系的轉(zhuǎn)換,變換細節(jié)見下面的數(shù)學基礎(chǔ)。

數(shù)學基礎(chǔ)

坐標變換涉及到六個系數(shù),表達式如下:

x_{physical} = ax_{user} + c y_{user} + e

y_{physical} = bx_{user} + d y_{user} + f

PS存儲了這個六個系數(shù)(a,b,c,d,e,f),坐標變換可以仿射變換來表示:

[{x_ \bullet }\;{y_ \bullet }] = [x\;y]\left[ {\begin{array}{*{20}{c}} a&b\\ c&d \end{array}} \right] + \left[ {e\ f} \right]

這個2\times2矩陣稱之為變換的線性元素,而后面相加的向量稱之為translation。這個變換過程其實是一種平移和旋轉(zhuǎn)。后面還會介紹一種透視變換。

PS如何存儲坐標變換

從上面的數(shù)學基礎(chǔ)中可以看出,六個系數(shù)(a~f)可以表示一組變換動作。在PS中,這六個參數(shù)被存儲在一個長度為6的向量中,稱之為matrix。

經(jīng)過我的測試,發(fā)現(xiàn)GMT之所以三維繪圖中的坐標旋轉(zhuǎn)出現(xiàn)問題,就是這六個系數(shù)計算有誤。

移動至三維坐標系

上面的放射變換矩陣表達式,在三維坐標系中可以表示為:

[{x_ \bullet }\;{y_ \bullet }\;1] = [x\;y\;1]\left[ {\begin{array}{*{20}{c}} a&b&0\\ c&d&0\\ e&f&1 \end{array}} \right]

待更新...


  1. Coordinates and conditionals in PostScript ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容