一、引子
對於一個標量場資料,我們可以描繪輪廓(Contouring),包括2D和3D。2D的情況稱為輪廓線(contour lines),3D的情況稱為表面(surface)。他們都是等值線或等值面。
以下是一個2D例子:
為了生成輪廓,必須使用某種形式的插值。這是因為我們只在資料集中的一個有限點集上有標量值,而我們的等高線值可能位於這兩個點的值之間。由於最常見的插值技術是線性插值,我們透過沿邊緣的線性插值在輪廓表面上生成點。如果一條邊在其兩個端點上有標量值10和0,如果我們試圖生成一條值為5的等高線,則邊緣插值計算該等高線透過邊緣的中點。
二、Marching cubes演算法——從2D理解
運用了分治思想,對每個單元格(cell)獨立地進行處理。該技術的基本假設是,一個輪廓只能以有限數量的方式透過一個單元格。我們可以構造一個案例表(case table),它列舉一個單元的所有可能的拓撲狀態(topological state)。拓撲狀態的數量取決於單元格頂點的數量,以及一個頂點相對於輪廓值可以具有的內部/外部關係的數量。標量值大於輪廓值的頂點被稱為在輪廓之內。標量值小於輪廓值的頂點被稱為在輪廓之外。例如,如果一個單元格有四個頂點,並且每個頂點可以在輪廓內部或外部,則有2^4 = 16種可能的方式透過單元格(在實現時可以用bit來實現)。在案例表中,我們不感興趣的是輪廓透過單元格的位置(例如,geometrical intersection),感興趣的只是它如何透過單元格(即單元格中輪廓的topology)。
一旦我們選擇好屬於哪一種case之後,就可以使用插值來計算contour line與cell edge相交的位置。該演算法處理一個單元格,然後移動,或行進到下一個單元格。在訪問所有單元格後,將完成輪廓。因此稱為marching cubes。
演算法的步驟如下:
四、演算法需要注意的事項
在2D中,輪廓模糊(ambiguos cases,如Fig6.5中的Case 5和Case 10)很容易處理:對於每個模糊的情況,我們選擇實現兩種可能的情況中的一種。根據選擇的不同,輪廓可以延伸或打破當前的輪廓,如Fig 6.9所示。任何一種選擇都是可以接受的,因為產生的等高線(contour line)將是連續的和封閉的(或將在資料集(data set)邊界結束)。
在3D中,這個問題更為複雜。我們不能簡單地選擇一個獨立於所有其他模糊案例的模糊案例。例如,Fig 6.9顯示瞭如果我們不小心實現了兩個相互獨立的情況,會發生什麼。在這個圖中,我們使用了通常的情況3,但用它的互補情況替換了情況6。互補的情況是透過將“暗”頂點與“光”頂點交換而形成的。(這相當於將頂點標量值從等值面值以上切換到等值面值以下,反之亦然。)將這兩種情況配對的結果是在等值面上留下了一個孔(hole)。
一個簡單而有效的解決方案透過新增額外的互補案例(complementary cases),擴充套件了原來的15個marching cubes案例。這些情況被設計成與鄰近的情況相容,並防止在等值面上產生孔。需要6個互補的情況,分別對應於行進立方體的情況3、6、7、10、12和13。互補的行進立方體案例如Fig 6.10所示。
此外,儘管我們說該演算法用於規則型別,如四邊形和立方體,但marching cubes可以應用於任何拓撲上等同於立方體的單元型別(例如,六面體或非立方體體素)。
五、應用
Fig 6.11d是由marching cubes建立的等值面。圖6.11b是一個來自計算機斷層掃描(CT)x射線成像系統的恆定影像強度(image intensity)的表面。(圖6.11a是該資料的二維子集。)其強度水平對應於人的骨骼。圖6.11c為恆定流密度(flow density)的等值面。圖6.11d為鐵蛋白分子的電子勢等值面。由於我們熟悉人體解剖學,圖6.11b中所示的影像可以立即被識別出來。然而,對於計算流體動力學和分子生物學領域的從業者來說,圖6.11c和圖6.11d同樣熟悉。正如這些例子所顯示的,輪廓形成的方法是各領域視覺化資料的強大而又通用的技術。
參考文件:VTKTextBook Scalar Algorithms