爨 瑩,朱航洲
(西安石油大學 計算機學院,陜西 西安 710065)
等值線圖是在石油勘探開發、采礦、地質、地球物理、地球化學和氣象等工程和技術領域內應用極廣的一種圖形,是眾多領域成果表示的重要圖件之一。在等值線繪制過程中,首先要對散點數據進行網格化,而常用的數據網格化方法(如距離加權法、方位法、趨勢面法、加權最小二乘法、疊加法)的精度和有效性都不高;Kriging估值技術雖然比傳統的估值技術具有更高的先進性和有效性,但這種方法目前還沒有得到廣泛應用,許多細節問題還處于研究階段。本文介紹利用Surfer軟件提供的可編程方法對散點數據進行網格化,然后用矩形追蹤法對網格化后的數據進行追蹤,并實現了放大、縮小、漫游、光滑等功能,繪制出的等值線具有更強的實用性。
為了繪制等值線圖,首先需要把離散分布的數據點網格化。為此,要建立數字高程模型(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文件里生成的網格點高程值,寫入網格化后的數據文件。
令任意一個網格邊兩端的數據值分別為 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 根就會失去,但這對于繪制等值線并無多大妨礙,至多漏繪一些極小的封閉等值線或等值線應該封閉而不完全封閉。
把網格縱邊和橫邊的細分段所組成的小網格稱為單元,它們的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中用虛線表示的等值線。但這些等值線在整個等值線圖形中并不起重要作用,忽略不繪并不影響圖形質量,卻可以節省許多機器時間。
關于等值線的繪制,主要有數據處理和圖形生成兩部分。在數據處理部分,主要是將離散數據網格化;而在圖形生成部分,系統將采用矩形網格追蹤法來生成等值線,然后就要對所生成的等值線進行光滑處理和標注。
離散數據網格化主要調用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.