美文网首页
GMT6.0三维绘图:坐标旋转原理

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

作者: 九天学者 | 来源:发表于2018-12-12 21:28 被阅读132次

    前期一篇文章: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表示)内置函数(公式)可以实现用户坐标系到物理坐标系的转换,变换细节见下面的数学基础。

    数学基础

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

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

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

    PS存储了这个六个系数(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。这个变换过程其实是一种平移和旋转。后面还会介绍一种透视变换

    PS如何存储坐标变换

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

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

    移动至三维坐标系

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

    [{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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/bdzhcqtx.html