前期一篇文章: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]
幾個重要的概念
物理坐標系:適應(yīng)于繪圖的物理設(shè)備,比如windows計算機的繪圖原點一般在左下角;但是在Unix系統(tǒng)里面,這個坐標原點一般在左上角。物理坐標系里面的基本長度單位是一個像素的寬度和高度。
紙張坐標系:坐標原點在紙張的左下角,長度單位是一個Adobe點(1/72英尺)
用戶坐標系:也就是繪制目標圖形(繪圖問題)的坐標系。繪圖過程中,用戶坐標系與紙張坐標系相同,但是可以使用
scale,translate,rotate函數(shù)來改變兩者的聯(lián)系。
PostScript(下面用PS表示)內(nèi)置函數(shù)(公式)可以實現(xiàn)用戶坐標系到物理坐標系的轉(zhuǎn)換,變換細節(jié)見下面的數(shù)學基礎(chǔ)。
數(shù)學基礎(chǔ)
坐標變換涉及到六個系數(shù),表達式如下:
PS存儲了這個六個系數(shù)(),坐標變換可以仿射變換來表示:
這個矩陣稱之為變換的線性元素,而后面相加的向量稱之為translation。這個變換過程其實是一種平移和旋轉(zhuǎn)。后面還會介紹一種透視變換。
PS如何存儲坐標變換
從上面的數(shù)學基礎(chǔ)中可以看出,六個系數(shù)(a~f)可以表示一組變換動作。在PS中,這六個參數(shù)被存儲在一個長度為6的向量中,稱之為matrix。
經(jīng)過我的測試,發(fā)現(xiàn)GMT之所以三維繪圖中的坐標旋轉(zhuǎn)出現(xiàn)問題,就是這六個系數(shù)計算有誤。
移動至三維坐標系
上面的放射變換矩陣表達式,在三維坐標系中可以表示為:
待更新...