前期一篇文章:Modern GMT Series:Slice in 3D View (三维切片图)
中指出了当前GMT官方版本中的三维显示问题存在漏洞,下面将一步一步说明如何修复这个漏洞。
GMT绘图过程其实是将一系列的绘图命令经过一定的计算写为PostScript文件,然后就可以将PS文件转换为其他的各种格式,比如pdf, png等。而在PostScript中是支持三维旋转的,类似下面这样的格式
PSL_GPP setmatrix
/PSL_GPP matrix currentmatrix def [0.71934 -0.347329 0 0.866025 0 820.463] concat
故 要修复此漏洞,首先必须明白两个问题:(1)PostScript中是如何实现三维显示(坐标旋转等)的;(2)GMT中是如何计算相应的旋转参数的。了解了这两个问题之后,问题便会迎刃而解!
PostScript的三维坐标问题[1]
几个重要的概念
-
物理坐标系:适应于绘图的物理设备,比如windows计算机的绘图原点一般在左下角;但是在Unix系统里面,这个坐标原点一般在左上角。物理坐标系里面的基本长度单位是一个像素的宽度和高度。
-
纸张坐标系:坐标原点在纸张的左下角,长度单位是一个Adobe点(1/72英尺)
-
用户坐标系:也就是绘制目标图形(绘图问题)的坐标系。绘图过程中,用户坐标系与纸张坐标系相同,但是可以使用
scale
,translate
,rotate
函数来改变两者的联系。
PostScript(下面用PS表示)内置函数(公式)可以实现用户坐标系到物理坐标系的转换,变换细节见下面的数学基础。
数学基础
坐标变换涉及到六个系数,表达式如下:
PS存储了这个六个系数(),坐标变换可以仿射变换来表示:
这个矩阵称之为变换的线性元素,而后面相加的向量称之为translation。这个变换过程其实是一种平移和旋转。后面还会介绍一种透视变换。
PS如何存储坐标变换
从上面的数学基础中可以看出,六个系数(a~f)可以表示一组变换动作。在PS中,这六个参数被存储在一个长度为6的向量中,称之为matrix
。
经过我的测试,发现GMT之所以三维绘图中的坐标旋转出现问题,就是这六个系数计算有误。
移动至三维坐标系
上面的放射变换矩阵表达式,在三维坐标系中可以表示为:
待更新...
网友评论