GMT6.0三维绘图:坐标旋转原理

前期一篇文章: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]

几个重要的概念

  1. 物理坐标系:适应于绘图的物理设备,比如windows计算机的绘图原点一般在左下角;但是在Unix系统里面,这个坐标原点一般在左上角。物理坐标系里面的基本长度单位是一个像素的宽度和高度。

  2. 纸张坐标系:坐标原点在纸张的左下角,长度单位是一个Adobe点(1/72英尺)

  3. 用户坐标系:也就是绘制目标图形(绘图问题)的坐标系。绘图过程中,用户坐标系与纸张坐标系相同,但是可以使用scale,translate,rotate函数来改变两者的联系。

PostScript(下面用PS表示)内置函数(公式)可以实现用户坐标系到物理坐标系的转换,变换细节见下面的数学基础。

数学基础

坐标变换涉及到六个系数,表达式如下:

PS存储了这个六个系数(),坐标变换可以仿射变换来表示:

这个矩阵称之为变换的线性元素,而后面相加的向量称之为translation。这个变换过程其实是一种平移和旋转。后面还会介绍一种透视变换

PS如何存储坐标变换

从上面的数学基础中可以看出,六个系数(a~f)可以表示一组变换动作。在PS中,这六个参数被存储在一个长度为6的向量中,称之为matrix

经过我的测试,发现GMT之所以三维绘图中的坐标旋转出现问题,就是这六个系数计算有误。

移动至三维坐标系

上面的放射变换矩阵表达式,在三维坐标系中可以表示为:

待更新...


  1. Coordinates and conditionals in PostScript ↩

你可能感兴趣的:(GMT6.0三维绘图:坐标旋转原理)