袁小翠 吳祿慎 陳華偉
(南昌大學(xué)機(jī)電工程學(xué)院 江西 南昌 330031)
?
Delaunay三角剖分算法改進(jìn)與對比分析
袁小翠吳祿慎陳華偉
(南昌大學(xué)機(jī)電工程學(xué)院江西 南昌 330031)
針對Delaunay算法的計算速度問題,從數(shù)據(jù)結(jié)構(gòu)和算法兩個方面加以改進(jìn)。對Delaunay三角剖分的代數(shù)拓?fù)浞治?,設(shè)計一種順序存貯的Hash數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)臨時單純形對象的快速和順序存取、查詢、插入和刪除等操作;以單純形邊對象的活性分析為核心,以Hash數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,消去生長法的遞歸過程;此外,提出基于微切平面的生長法,將基于空間四面體的空球搜索降維至局部二維的空圓搜索。對汽車擋泥板和兔子模型進(jìn)行三角剖分實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果表明,消去遞歸的生長法和基于微切平面的生長法和傳統(tǒng)的生長法三角剖分效果相同,但是計算速度比傳統(tǒng)方法效率更高。
Delaunay三角剖分生長法半空間隱式曲面
逆向工程通過三維光學(xué)掃描儀獲取物體形貌數(shù)據(jù),該數(shù)據(jù)通常是海量的三維點(diǎn),在數(shù)據(jù)處理中,需要經(jīng)過三角化、光滑曲面重建才能為正向CAD軟件所采用。點(diǎn)云三角化網(wǎng)格重建是數(shù)據(jù)由離散點(diǎn)域向面域求解的第一步,是后續(xù)光滑曲面重構(gòu)的基礎(chǔ)。其重構(gòu)方法主要有基于Delaunay三角剖分的方法[1,2]、基于區(qū)域擴(kuò)張的方法[3,4]和基于實(shí)體布爾差運(yùn)算的方法[5,6],其中生長法是最常用的Delaunay三角剖分法[7]。目前,已有諸多學(xué)者開始采用隱式曲面法[9-11]構(gòu)造三角剖分。盡管如此,作為三角剖分的基礎(chǔ),Delaunay法仍然集成于主流算法和商品化軟件之中,尤其是在國內(nèi),Delaunay三角網(wǎng)格構(gòu)造仍然是一個熱點(diǎn)研究問題。作為一個三角網(wǎng)格剖分的基礎(chǔ)和共性問題,本文對Delaunay三角剖分中的生長法進(jìn)行分析,針對Delaunay算法的計算速度問題,設(shè)計一種順序存貯的Hash數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)臨時單純形對象的快速存取、插入和刪除等操作。此外,本文還提出基于微切平面的生長法,將基于空間四面體的空球搜索降維至局部二維的空圓搜索,提高三角剖分的時間效率。
代數(shù)拓?fù)渲校琻-單純形(n-simplex)拓?fù)涞葍r于n-球面,每個n-單純形是n維帶邊界流形。n-單純形是三角形和四面體的一種泛化,一個n維單純形是指包含n+1個節(jié)點(diǎn)的凸多面體。其精確定義是:n-simplex是某個n維以上的歐氏空間Rd(d≥n)中的n+1個仿射無關(guān)的點(diǎn)集的凸包。例如,0-simplex就是點(diǎn),1-simplex就是線段,2-simplex就是三角形,3-simplex就是四面體。將構(gòu)成單純形的各點(diǎn)稱為單純形的頂點(diǎn)(vertex)。進(jìn)一步地,將單純形的k+1個頂點(diǎn)的凸包組合所構(gòu)成的單純形稱為k維面(k-face),如點(diǎn)是0-face,邊是1-face,三角面是2-face。
拓?fù)淇臻g可以通過單純形組合構(gòu)造,人們希望把一個拓?fù)鋵ο笃史殖稍S多個小的單純形,并要求任何兩個相鄰單純形的相交部分仍是一個單純形——這種剖分稱為單純剖分。在曲面情形,就是三角剖分。
R3空間中面的剖分是2-simplex,即三角形的組合,則相鄰單純形的相交部分為1-face,即為邊。三角化過程就是以邊為基礎(chǔ),逐步向外擴(kuò)展生成三角形,新三角形的邊將作為繼續(xù)生長的基礎(chǔ)。三角形生長應(yīng)遵循一定的規(guī)則,Delaunay三角剖分規(guī)定了兩項(xiàng)重要規(guī)則:
1) 空圓特性:任一Delaunay三角形的外接圓內(nèi)不會有其他點(diǎn)存在,如圖1(a)所示;
2) 最大化最小角特性:在點(diǎn)集P可能形成的三角剖分中,Delaunay剖分形成的三角形的最小角最大,如圖1(b)所示。
圖1 Delaunay三角剖分中的兩個重要特性
圖2 生長法三角剖分流程圖
生長法[12]是Delaunay三角剖分最直接的方法,算法設(shè)計直接由Delaunay三角剖分定義而來,算法簡單明了。根據(jù)拓?fù)涠x,Rn空間可由n維(及n維以下)單純形組合構(gòu)造,相鄰兩個單純形的相交部分為n-1維面。生長法是以面為基礎(chǔ),在生長規(guī)則的控制下,為面加入頂點(diǎn),構(gòu)造新的單純形。生長法三角剖分流程如圖2所示。
傳統(tǒng)的生長法[13,14]采用遞歸過程實(shí)現(xiàn),Triangulation算法為遞歸生長法的C語言偽代碼:
FunctionTriangulation(P,f0)/*P為輸入點(diǎn)集,f0為輸入單純形面*/{
v = FindNextVertex(P,f0);
s = BuildSimplex(f0,v);
print(s);
//打印輸出
for each f∈s
Triangulation(P,f);
}
Triangulation算法以一輸入面f0為基礎(chǔ),使用FindNextVertex函數(shù)查找一個頂點(diǎn)v,使用f0和v構(gòu)造單純形s。接下來遍歷s中的每個面f,重新調(diào)用Triangulation構(gòu)造下一個單純形。print語句打印輸出新構(gòu)建的單純形,如果需要存貯輸出,則只需設(shè)置一個列表,順序存貯即可。
Triangulation算法是一個遞歸算法,容易理解和實(shí)現(xiàn),但是大數(shù)據(jù)量計算的算法時域和空域特性差,因此需進(jìn)行消去遞歸。據(jù)此,本文從數(shù)據(jù)結(jié)構(gòu)上改進(jìn)遞歸生長法,設(shè)計了一個(n-1)維面列表FList,用于動態(tài)存貯各面,從而消除遞歸。
3.1數(shù)據(jù)結(jié)構(gòu)設(shè)計
數(shù)據(jù)結(jié)構(gòu)設(shè)計上,隊列能夠?qū)崿F(xiàn)順序存取和快速查找,但是刪除操作效率低。為了提高算法性能,尤其是實(shí)現(xiàn)隨機(jī)位的快速搜索和刪除操作,采用哈希表進(jìn)行數(shù)據(jù)操作。常規(guī)哈希表中數(shù)據(jù)的存貯位是隨機(jī)的,因此還必須設(shè)計順序存貯的哈希表結(jié)構(gòu)。本文使用C++標(biāo)準(zhǔn)庫的list容器作為順序存貯器,結(jié)合Boost庫的非排序類容器unordered中的unordered_set哈希模板,構(gòu)造順序存貯的哈希表。
unordered_set
數(shù)據(jù)結(jié)構(gòu)定義:
template
struct StruHashFunc
{
size_t operator()(Tp1) const
{
return pHashFunc(p1);
//hash_value函數(shù)以一個對象為參數(shù)
}
};
template
struct StruEqualFunc
{
bool operator()(Tp1,Tp2) const
{
return pEqualFunc(p1,p2);
//equal函數(shù)以兩個對象為參數(shù)
}
};
typedef StruHashFunc
typedef StruEqualFunc
接下來,就可以自定義順序哈希表。為了便于用戶使用,以list為外部容器,用于輸入輸出。在數(shù)據(jù)結(jié)構(gòu)內(nèi)部使用hash容器存貯對象并生成對應(yīng)key值,用于搜索定位,兩者內(nèi)部的讀寫操作要保證一致。如下為自定義接口IListedHash的過程:
1) 以對象類為模板參數(shù)定義該接口類:
ctemplate
2) 以TValue為list參數(shù),定義list接口類:
typedef std::list
3) 定義哈希表接口類:
typedefboost::unordered_set;
4) 定義迭代器,其中hash迭代器為內(nèi)部迭代器,list迭代器為外部迭代器:
typedef typenameI Hash::iteratoriterator_in;
typedef typename IList::iteratoriterator;
5) 定義內(nèi)部數(shù)據(jù)存貯變量:
IListlistdata和IHash hashdata;
6) 定義與list類似的各項(xiàng)操作,主要有insert、find、erase等操作和begin、end等迭代器操作方法,在實(shí)現(xiàn)上保證listdata和hashdata數(shù)據(jù)的同步讀寫。
采用以上設(shè)計的哈希表進(jìn)行數(shù)據(jù)操作,對Triangulation算法進(jìn)行消去遞歸,改進(jìn)后為Triangulation2算法。
Triangulation2算法的偽代碼為:
FunctionTriangulation2(P,FList)
/*P為輸入點(diǎn)集,F(xiàn)List為輸入面列表*/
{
whileFList≠
{
f0 = ExtractHash(FList);
v = FindNextVertex(P,f0);
s = BuildSimplex(f0,v);print(s);
//打印輸出
for each f∈s
UpdateHash(FList,f);
}
}
UpdateHash(FList,f)
{
if f∈FList
DeleteHash(FList,f);
else
InsertHash(FList,f);
}
上述代碼表示中有三個哈希表的操作函數(shù):ExtactHash、DeleteHash和InsertHash,它們分別對面列表執(zhí)行讀取、刪除和插入操作,自定義UpdateHash函數(shù)對面進(jìn)行更新操作。為了避免重復(fù)生長,讀取f0的ExtractHash函數(shù)中包含了f0的DeleteHash操作。算法以面列表FList為輸入,循環(huán)判斷是否為空,每次循環(huán)從FList中讀取一個面f0,構(gòu)建單純形s,遍歷s中的每個面f,如果已存在于列表,則從FList中刪除,否則,插入f0,算法直至FList為空時結(jié)束。
3.2三角剖分的詳細(xì)過程
三角化算法的核心語句是FindNextVertex函數(shù)中滿足Delaunay規(guī)則的點(diǎn)的搜索。為了敘述方便,本文給出如下兩個定義:
定義1由多個三角形或者兩條邊界邊完全封閉的點(diǎn)為死點(diǎn);反之,未被完全封閉的點(diǎn)稱為活點(diǎn)。
定義2相鄰三角形的共有邊或邊界邊為死邊;其他邊稱為活邊。
設(shè)點(diǎn)集為P,當(dāng)前遍歷面為邊e(v0,v1),其中v0,v1∈P是e的兩端點(diǎn),以邊e為基礎(chǔ),采用以下生長規(guī)則搜索第三點(diǎn)v2:
?只對鄰域點(diǎn)進(jìn)行搜索
此規(guī)則用于確定總體搜索范圍。設(shè)點(diǎn)v0和v1的鄰域分別為Neib0和Neib1,則搜索范圍確定為Neib01=Neib0∪Neib1。
?只對活點(diǎn)進(jìn)行搜索
圖3 點(diǎn)和邊的活性
在圖3中,粗線邊v5v7和邊v7v8為已確定的邊界邊。以v0為端點(diǎn)的邊,以及邊v5v4、v4v7、v4v8均為死邊,兩條邊界邊v5v7、v7v8亦為死邊,其他邊均為活邊。顯然,死邊是當(dāng)前搜索狀態(tài)下的內(nèi)部邊,不能作為基礎(chǔ)邊再行生長,需要從面列表FList中刪除;相對應(yīng)地,活邊作為外部邊,應(yīng)作為生長邊進(jìn)入FList。
為了準(zhǔn)確表述,用點(diǎn)或邊的使用頻次f表示點(diǎn)或邊的活性。在構(gòu)網(wǎng)過程中,一條邊只能為邊界邊,或者為相鄰兩個三角形的共有邊,因此邊的活性取值范圍為{0,1,2}。點(diǎn)的使用頻次與其構(gòu)邊的次數(shù)有關(guān),設(shè)與點(diǎn)v關(guān)聯(lián)的邊集為E∈FList,則f的計數(shù)規(guī)則是:如果E=?,則置f=-1;否則f=E.size。由于E是FList的子集,因此f值和E的增減都在FList中體現(xiàn):v的每次構(gòu)邊都將通過InsertHash加入FList,相應(yīng)有f++;每次提取邊構(gòu)建三角形時都將使用ExtractHash從FList中刪除邊,相應(yīng)有f--。
?生長點(diǎn)必須位于近鄰三角形的右側(cè)
此規(guī)則用于限定生長方向。為了定義三角形的生長方向,一般統(tǒng)一定義為逆時針(或順時針)方向?yàn)槿敲嬲?。這也延伸定義了構(gòu)面邊為有向邊,其方向與面的方向一致。如圖4所示,已構(gòu)三角形面v0v1v2為逆時針方向,三條邊v0v1、v1v2、v2v0亦為逆時針方向。此時,若對邊v1v2搜索新的生長點(diǎn),為了避免出現(xiàn)交叉三角形,必須限定生長點(diǎn)位于邊v1v2的“右側(cè)”。二維情形下,邊v1v2將平面劃分為左右兩個半平面;三維空間中,假想經(jīng)過邊v1v2創(chuàng)建一個與三角面v0v1v2垂直的平面,該平面將整個空間劃分為兩個半空間,分別記為HS-和HS+。邊v1v2是兩個半空間的一條交界邊,為了滿足三角面方向統(tǒng)一的要求,在搜索空間HS+中,對邊v1v2進(jìn)行擴(kuò)展時,應(yīng)取其反向邊v2v1。本規(guī)則限定了生長點(diǎn)必須位于HS+空間,該規(guī)則下,圖3的備選點(diǎn)集{v3,v4,v5}中只有{v4,v5}為合法生長點(diǎn)集。
圖4 半空間搜索
?限定三角形的最小角度Amin
此規(guī)則避免出現(xiàn)狹長三角形,用于滿足Delaunay最大化最小角特性。推薦Amin=5°~30°。
?三角形外接圓半徑與當(dāng)前邊的比值大于限定值Rmin
此規(guī)則用于外接圓半徑,即縮小待建三角形的影響范圍,旨在滿足Delaunay空圓特性。
3.3基于微切平面的生長法
在三維點(diǎn)云空間中,對鄰域點(diǎn)的搜索實(shí)際是基于四面體的空球搜索,搜索速度和精度以及編程難度比二維點(diǎn)云大。對此,考慮將三維空間降維至二維,將三維點(diǎn)投影至微切平面,在二維平面內(nèi)構(gòu)建三角形。之后通過空間點(diǎn)與投影點(diǎn)的映射關(guān)系將平面三角網(wǎng)映射回空間,從而實(shí)現(xiàn)三角形的空間構(gòu)網(wǎng)。算法可簡單描述為以下四個步驟:
1) 由當(dāng)前遍歷面為邊e(v0,v1)的鄰域Neib01=Neib0∪Neib1構(gòu)建微切平面T,構(gòu)造UV二維坐標(biāo)系;
采用C++語言編程在Microsoft visual studio 2008上實(shí)現(xiàn)以上算法,并且調(diào)用OpenGL庫函數(shù)顯示點(diǎn)云,實(shí)驗(yàn)所用的計算機(jī)配置為Intel Core 2.30 GHz CPU,1.19 GB內(nèi)存。對汽車擋泥板、兔子、馬鞍模型進(jìn)行三角剖分,其點(diǎn)云數(shù)量分別是:6408、34 834、56 780個。為便于敘述,將Triangulation算法稱為方法1,Triangulation2為方法2,基于微切平面的生長法為方法3。方法1、方法2三角剖分思路相同,不同的是數(shù)據(jù)結(jié)構(gòu)操作以及遞歸過程。三種方法對三種模型的三角化結(jié)果和耗時比較如表1和圖5-圖7所示。圖5-圖7中(a)是點(diǎn)云模型,(b)是方法1、方法2三角剖分結(jié)果,(c)是方法3結(jié)果。從表1和圖5-圖7中得出,方法1-方法3的三角化結(jié)果相同,但從耗時比較上來看,方法2三角剖分速度比方法1快,尤其是當(dāng)點(diǎn)云數(shù)據(jù)較大時,方法2耗時幾乎是方法1的一半。此外,本文提出的基于微切平面的生長法即方法3耗時更小,與方法2相同數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)方法3時耗時比傳統(tǒng)的生長法(方法2)耗時更小,對大數(shù)據(jù)點(diǎn)云模型,本文的生長法三角剖分效率更高。
表1 3個模型的實(shí)驗(yàn)數(shù)據(jù)
圖5 擋泥板模型三角化結(jié)果
圖6 兔子模型三角化結(jié)果
圖7 馬鞍模型三角化結(jié)果
本文對Delaunay三角剖分算法中的生長法進(jìn)行了詳細(xì)的分析,設(shè)計了一種順序存貯的Hash數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)臨時單純形對象的快速存取、插入和刪除等操作,采用Hash數(shù)據(jù)結(jié)構(gòu)消去遞歸的生長法執(zhí)行時間更短。此外,本文提出了基于微切平面的生長法,將基于空間四面體的空球搜索降維至局部二維的空圓搜索,同樣采用Hash數(shù)據(jù)結(jié)構(gòu)對基于微切平面法的生長法進(jìn)行操作。微切平面生長法三角剖分效果與傳統(tǒng)方法效果相同,但微切平面生長法速度更快。對數(shù)據(jù)量為30 KB的兔子模型,三種方法的計算時間分別是8.5、4.3、3.2 s。
[1] Digne J,Cohen-Steiner D,Alliez P,et al.Feature-preserving surface reconstruction and simplification from defect-laden point sets[J].Journal of Mathematical Imaging and Vision,2014,48(2):369-382.
[2] Lhuillier M.2-Manifold Tests for 3D Delaunay Triangulation-Based Surface Reconstruction[J].Journal of Mathematical Imaging and Vision,2014,51(1):98-105.
[3] Gong W,Liu Y J,Tang K,et al.Approximate Delaunay mesh reconstruction and quality estimation from point samples[J].Journal of Computational and Applied Mathematics,2015,274(15):23-34.
[4] Gálvez A,Iglesias A.Particle swarm optimization for non-uniform rational B-spline surface reconstruction from clouds of 3D data points[J].Information Sciences,2012,192(1):174-192.
[5] Boissonnat J D.Geometric structures for three-dimensional shape representation[J].ACM Transactions on Graphics (TOG),1984,3(4):266-286.
[6] Edelsbrunner H,Mücke E P.Three-dimensional alpha shapes[J].ACM Transactions on Graphics (TOG),1994,13(1):43-72.
[7] Coakley E S,Rokhlin V.A fast divide-and-conquer algorithm for computing the spectra of real symmetric tridiagonal matrices[J].Applied and Computational Harmonic Analysis,2013,34(3):379-414.
[8] Xu Y,Liu L,Gotsman C,et al.Capacity-constrained Delaunay triangulation for point distributions[J].Computers & Graphics,2011,35(3):510-516.
[9] Carr J C,Beatson R K,Cherrie J B,et al.Reconstruction and representation of 3D objects with radial basis functions[C]//Proceedings of the 28th annual conference on Computer graphics and interactive techniques,2001:67-76.
[10] 趙建東,康寶生,康健超,等.改進(jìn)的基于徑向基函數(shù)的曲面重建算法[J].西北大學(xué)學(xué)報:自然科學(xué)版,2012,42(5):744-748.
[11] 方林聰,汪國昭.基于徑向基函數(shù)的曲面重建算法[J].浙江大學(xué)學(xué)報:工學(xué)版,2010,44(4):728-731.
[12] 余杰,呂品,鄭昌文.Delaunay 三角網(wǎng)構(gòu)建方法比較研究[J].中國圖象圖形學(xué)報,2010,15(8):1158-1167.
[13] 袁舒,楊烜.基于 Delaunay 三角網(wǎng)生長法的并行圖像插值方法[J].計算機(jī)應(yīng)用與軟件,2012,29(3):62-68.
[14] 孟憲海,成文迪,徐博,等.基于 Voronoi 取小鄰近點(diǎn)集的 Delaunay 三角化方法[J].圖學(xué)學(xué)報,2013,34(6):36-41.
IMPROVEMENT AND COMPARATIVE ANALYSIS OF DELAUNAY TRIANGULATION ALGORITHM
Yuan XiaocuiWu LushenChen Huawei
(School of Mechanical and Electrical Engineering,Nanchang University,Nanchang 330031,Jiangxi,China)
Aiming at the problem of computation speed of Delaunay algorithm,we improved it from two aspects of data structure and algorithm.After analysing the algebraic topology of Delaunay triangulation,we designed a sequentially stored Hash data structure so that the temporary simplex object can be accessed,queried,inserted and deleted rapidly and in order.We took the activity analysis of edge object of simplex as the core,and employed Hash data structure to operate the recursion process of incremental algorithm removal.Besides we proposed the micro-tangent plane-based incremental algorithm,which decreases the dimension of the space tetrahedron-based blank sphere searching to local two-dimension blank circle searching.The triangulation experiments were carried out on car fender and bunny model,experimental results demonstrated that the triangulation results of recursion-removed and micro-tangent plane-based Incremental algorithms were the same as that of traditional Incremental algorithm,but the computation speed was higher than the traditional method.
Delaunay triangulationIncremental algorithmHalf spaceImplicit surface
2015-04-22。國家自然科學(xué)基金項(xiàng)目(51365037,51065021)。袁小翠,博士生,主研領(lǐng)域:逆向工程與數(shù)字圖像處理。吳祿慎,教授。陳華偉,講師。
TP391
A
10.3969/j.issn.1000-386x.2016.09.039