一种新的等值线绘制方法研究
2012-08-20朱航洲
爨 莹,朱航洲
(西安石油大学 计算机学院,陕西 西安 710065)
等值线图是在石油勘探开发、采矿、地质、地球物理、地球化学和气象等工程和技术领域内应用极广的一种图形,是众多领域成果表示的重要图件之一。在等值线绘制过程中,首先要对散点数据进行网格化,而常用的数据网格化方法(如距离加权法、方位法、趋势面法、加权最小二乘法、叠加法)的精度和有效性都不高;Kriging估值技术虽然比传统的估值技术具有更高的先进性和有效性,但这种方法目前还没有得到广泛应用,许多细节问题还处于研究阶段。本文介绍利用Surfer软件提供的可编程方法对散点数据进行网格化,然后用矩形追踪法对网格化后的数据进行追踪,并实现了放大、缩小、漫游、光滑等功能,绘制出的等值线具有更强的实用性。
1 绘制等值线图原理
1.1 离散数据网格化
为了绘制等值线图,首先需要把离散分布的数据点网格化。为此,要建立数字高程模型(DEM),其主要功能就是将离散数据网格化。其主要步骤为:首先,由原始数据点的横、纵坐标的最小值和最大值构成矩形网格的边界;然后,根据用户需要将矩形再划分为m×n个小矩形,即形成矩形网格;最后,用插值算法得到每个网格点的高程值。
DEM内插有多种算法,常用的有距离加权法、样条函数内插、最小二乘配置法和Kriging方法等。本文使用Suffer软件中提供的可编程方法对散点数据网格化,其具体算法如下。
(1)输入参数;
(2)根据输入参数从数据库提取 X、Y坐标及高程值Z,并保存到文本数据文件;
(3)在程序中引用 surfer并创建 surfer(srf)和 grid(grd)对象;
(4)用srf对象的GridData方法将文本文件转换成surfer格式文件(.grd文件);
(5)用grd对象的GetNode方法获取 grd文件里生成的网格点高程值,写入网格化后的数据文件。
1.2 等值点的计算
令任意一个网格边两端的数据值分别为 Z1、Z2,如图 1所示,对于任意一条等值线 W,它在该边上 Z(x,y)-W=0,即等值线所通过的点,可以有0~3个根。
当等值线恰好等于网格节点的值时,这种网格点被称作退化点,当遇到退化点时,在网格点值上加上一个非常小的正数,以消除退化点[3]。
如图1中的Z1、Z2值都不会等于等值线 W 的值,这时,网格边上对于某一条等值线 W,存在根Z(x,y)-W=0的可能性有:
(1)Z1>W,Z2>W 或 Z1<W,Z2<W 时,没有根,如图 1中的(a)和(b),或存在两个根,如图 1 的(e)和(f)。
(2)Z1<W,Z2>W 或 Z1>W,Z2<W 时,存在一个根,如图 1中的(c),或存在两个根,如图 1中的(d),其中 A根是重根,如图 1中的(g)。
对于立方函数,利用数值法求根。这时可以将网格边长nx和ny再分成等间距的细分段,如图1中的(d)所示,然后求出每个细分段两端的函数值Zk和Zk+1。当Zk或Zk+1等于等值线值W时,同样需要加上一个非常小的正数,以消除退化点。这样,当(Zk-W)(Zk+1-W)<0时,说明该细分段上存在一个根。该细分段的长度可以小到以机器步长来计算,最小可以到描绘仪机器步长的2倍,这样可以保证在曲面函数上追踪所得到的等值线连续光滑而不会发生方向上的突变。在找到根值的细分段上,再以Zk和Zk+1作线性内插求得所在根及等值点的位置。
数值法找根时有时会失根,尤其对于重根情况,如图 1(d)中的 A根,由于它两端的 Zk和 Zk+1都小于 W,因此(Zk-W)(Zk+1-W)>0,A 根就会失去,但这对于绘制等值线并无多大妨碍,至多漏绘一些极小的封闭等值线或等值线应该封闭而不完全封闭。
1.3 等值线的追踪
把网格纵边和横边的细分段所组成的小网格称为单元,它们的4个节点称为单元节点,以区别于原始的网格与网格节点。这样,对于每一个单元在其单元节点上求出函数值后(若遇到有退化点时,同样需要通过加一个很小的正数来处理),有图2所示的8种连接等值线的可能(其中+号表示节点值大于等值线值,-号表示节点值小于等值线值)。
(1)单元节点上函数值同时大于或同时小于等值线值时,该单元内没有等值线通过,如图2(a)所示。
(2)单元节点上函数值大于和小于等值线时,单元边上要么存在两个根,要么存在4个根。存在两个根时,两根在对边上,如图 2(b)、图 2(c)所示,两根在邻边上,如图 2(d)、图 2(e)、图 2(g)、图 2(h)所示;存在 4个根时,4个根分别在单元的4个边上。对于两个根的情况,只要找到根的位置就可以相连;对于4个根的情况,则需规定底边根与左边根相连,右边根与上边根相连或底边根与右边根相连,右边根与上边根相连,如图2(f)所示,这样就能保证等值线间不会出现相交现象[4]。
图3表示在一个矩形网格(i,j)内,将纵边 ny等分成6个细分段,将横边nx等分成5个细分段的连法示意图。在等分后的每个单元节点上算出函数值Z。Z>W(W 为等值线值)时,以“+”表示;Z<W 时,以“-”表示。这样在每个“+”、“-”节点之间必定存在一个等值线根,可用线性内插求出它的位置,连成的等值线如图3中的折线所示。由于网格边上的函数是立方函数,它在网格边上最多有 3个根,如图 3中,底边上有 3个根 A1、A2、A3。在理论上只要对全部网格内的单元节点扫描一遍,把求得的根值用图2中的规则相连即可画出等值线图。
但是这样计算会花费计算机大量时间,而且大部分单元内是不会有等值线通过的。因此,需要设计一种总等值线的方法,使得只在等值线会通过的单元节点上才求出函数值,而大部分不通过等值线的单元不必求节点函数值,以节省机器运算时间、加快速度。这里还需指出,图3是一个复杂化的例子,实际上,对于特定的等值线,一个网格内的等值线可能是很少的,或者只有一条或少数几条,还有很多网格根本就没有。此外,当分段加密时,等值线将逐渐变成光滑曲线,这是因为拟合网格点的函数是一个连续光滑的函数。因此,利用上述方法,就不需要对等值线再作光滑处理。
将等值线分为从边界出发到边界结束的等值线以及在内部封闭的等值线两种类型,如图4所示。无论哪种类型的等值线,都必须已知有顺序相邻的 A1、A2两个等值点。 设它们的坐标值分别为(a1x,a1y)及(a2x,a2y),分别以 nx和 ny为单位长度,其坐标的整数值为(a1j,a1i)及(a2j,a2i)。任意设两个相邻的单元如图 5中的单元Ⅰ、Ⅱ所示,A2落在单元Ⅰ和Ⅱ的邻边上,A1落在单元Ⅰ的其他三边的任意一边上。用(i,j)表示单元Ⅰ的序号,用(i+1,j)、(i,j+1)、(i-1,j)、(i,j-1)表示 单 元Ⅱ 的 序号,分别相当于图 5 中的(a)、(b)、(c)、(d)4 种情况,则下一等值点追踪方向依次由下述4个判别式确定。
(1)若 a1i<a2i,即图 5(a)的情况,下一点在单元(i+1,j)的另外三边上;
(2)若 a1j<a2j,即图 5(b)的情况,下一点在单 元 (i,j+1)的另外三边上;
(3)若 a2j<a2x,即图 5(c)的情况,下一点在单元(i-1,j)的另外三边上;
(4)若 a2i<a2y,即图 5(d)的 情 况 ,下 一 点 在 单 元 (i,j-1)的另外三边上。
以图4的网格数组为例,首先从网格数组四边寻找第一类等值点,当在底边、左边、右边(或上边)的边界上找到一个等值点时,令其为A2。因为追踪一条等值线必须先要知道两个等值点,所以必须再假设一个等值点A1。当 A2在底边边界时,令 A1、A2的位置关系满足:a1i=-1,a1j=a2j;当 A2在左边边界时,令 a1i=a2i,a1j=-1;当A2在右边(或上边)边界时,令 a1i=a2i,a1j=a2j。 然后利用 4个判别式顺次进行判断,即可追踪到下一等值点A3。一旦追踪到 A3,再把 A2充到 A1中,A3充到 A2中,就可继续追踪,一直追踪到图形边界为止,这样就完成了第一类等值线的绘制。对于第二类等值线,从内部网格的横边或纵边上先寻找它的第一个等值点,令其为A2。对于横边上的A2,再设一个等值点A1,使其和A2的位置关系满足a1i=-1,a1j=a2j;对于位于纵边上的 A2,令其a1i=a2i,a1j=-1,然后应用4个判别式顺次进行判断,即可追踪到下一个等值点A3。按照第一类等值点的追踪方法继续追踪下去,直到重新追踪到首先找到的那个A2点的位置为止,这时便完成了一条封闭等值线的绘制。必须指出,无论属于哪种类型的等值线,每当追踪到等值点落在网格边上(而不是网格内部的单元边上)时,必须将其位置记在一个表内。对于封闭性等值线,还需把第一个等值点的位置记住,以便每次开始找到第一个A2点时,与表中的位置作比较,如果已经在表中,则不再重绘。对于封闭等值线,每追踪到一个位于网格上的点时,还需同记录下来的第一个等值点位置进行比较,以判断是否回到原来的出发位置。
按上述方法追踪等值线,可以避免计算许多没有等值线通过的单元的节点函数值,但也有可能漏掉一些只在一个网格之内的小封闭等值线,如图4中用虚线表示的等值线。但这些等值线在整个等值线图形中并不起重要作用,忽略不绘并不影响图形质量,却可以节省许多机器时间。
2 等值线绘制
关于等值线的绘制,主要有数据处理和图形生成两部分。在数据处理部分,主要是将离散数据网格化;而在图形生成部分,系统将采用矩形网格追踪法来生成等值线,然后就要对所生成的等值线进行光滑处理和标注。
离散数据网格化主要调用Surfer提供的方法进行,具体程序如下。
网格追踪程序主要封装在CContourTrace类中。
利用本文方法所生成的等值线如图6所示。
本文是提出了一种新的方法来实现等值线的绘制,它首先用成熟软件Surfer将原始数据进行网格化,再利用矩形网格追踪法追踪网格,并按照实际需求实现了对等值线的缩放、平移、光滑和标注等功能。利用本方法所绘制的等值线主要在石油勘探开发、采矿等领域得到应用。使用本方法所绘制的等值图较其他方法效果更好、精确度更高、速度更快,是一个实用有效的等值线绘制方法。
[1]王永会,宋晓宇,栾方军.基于网格的等值线图快速生成算法[J].计算机工程与应用,2001(17):124-125.
[2]陈学工,刘凯敏.一种基于格网法快速生成等值线的算法[J].电脑与信息技术,2007,15(3):4-6.
[3]宋丽娟,龚晓峰,钟猛.基于网格法的等值线绘制方法[J].现代电子技术,2005,28(14):65-67.
[4]韦美雁,杜丹蕾.基于规则网格的等值线的生成研究[J].湖南科技学院学报,2007,28(4):39-41.
[5]于嘉,吴旭.一种改进的矩形网格等值线追踪算法[J].河南师范大学学报,2008,36(6):34-36.
[6]张利,王俊彪,张贤杰.基于矩形网格追踪法的曲面主曲率等值线生成算法 [J].计算机应用研究,2009,26(8):3179-3181.