一種單機(jī)多核環(huán)境下約束地形并行構(gòu)建方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于測(cè)繪、地理信息技術(shù)領(lǐng)域,涉及一種單機(jī)多核環(huán)境下約束地形并行構(gòu) 建方法。
【背景技術(shù)】
[0002] 三角剖分可追溯到二十世紀(jì)三十年代,于1934年由俄國(guó)著名數(shù)學(xué)家Delaunay在 解決數(shù)值分析問(wèn)題提出的,然而當(dāng)時(shí)的生成算法并不成熟,后經(jīng)過(guò)學(xué)者們的努力探索研究, 在七十年代后期得到了較大的發(fā)展和應(yīng)用,如今已有多種Delaunay三角剖分算法被人們 接受和采用。Tsai根據(jù)實(shí)現(xiàn)過(guò)程將剖分算法分成了三類(lèi),即分治算法、逐點(diǎn)插入法和三角網(wǎng) 生長(zhǎng)法。除此之外,此后的研究大多是基于這三類(lèi)算法在兩種方式上進(jìn)行改進(jìn),一是對(duì)算法 實(shí)現(xiàn)過(guò)程的某方面繼續(xù)改進(jìn)和完善,二是研究?jī)煞N算法同時(shí)參與D-TIN構(gòu)建的合成算法, 當(dāng)然還有學(xué)者提出了新的算法如:基于掃描線(xiàn)的剖分法、基于凸殼的剖分法、基于遺傳算法 的剖分法等。
[0003] Shamos和Hoey在1975首次提出了分治算法,算法設(shè)計(jì)的目的主要是為了生成 Voronoi圖,而Lewis和Robinson首次將分治思想應(yīng)用于D-TIN構(gòu)建中。Lawson在1977 年首次提出了逐點(diǎn)插入法及其改進(jìn)算法,Lee和schachter等人先后進(jìn)行了改進(jìn)和完善,這 些改進(jìn)的用于實(shí)現(xiàn)D-TIN構(gòu)建的逐點(diǎn)插入法中,主要差別在于設(shè)置初始多邊形和建立初始 三角網(wǎng)的方法不同。Green和Sibson在1978年首次提出了三角網(wǎng)生長(zhǎng)算法,并實(shí)現(xiàn)了一個(gè) 生成Dirichlet多邊形圖的生長(zhǎng)算法,McCullagh和Ross為了減少搜索第三點(diǎn)的時(shí)間,將 點(diǎn)集進(jìn)行了分塊和排序從而達(dá)到縮短時(shí)間目的。Brassel,Reif,Maus等人進(jìn)行了類(lèi)似的改 進(jìn),主要在改進(jìn)搜尋"第三點(diǎn)"上入手。A. Mirante和N. Weingarten在1982年提出了輻射 掃描法,然而這種方法產(chǎn)生的三角網(wǎng)并不是真正的D-TIN,主要因其不一定能滿(mǎn)足外接圓性 質(zhì)。Steven Fortune于1987年在A(yíng)lgorithmica上提出了 V-圖生成的平面掃描算法思想。 J.R. Shewchuk 等人應(yīng)用掃描線(xiàn)算法實(shí)現(xiàn)了 D-TIN 構(gòu)建。Marcelo Kallmann 和 Hanspeter Bieri等提出了在約束Delaunay三角網(wǎng)中進(jìn)行約束點(diǎn)和線(xiàn)的插入和刪除算法,并解決了自 相交或重復(fù)的點(diǎn)自動(dòng)檢測(cè),得到一個(gè)完全動(dòng)態(tài)的約束Delaunay三角剖分,同時(shí),在可視化、 重構(gòu)、地理信息系統(tǒng)等應(yīng)用方面進(jìn)行了討論。
[0004] 針對(duì)D-TIN串行算法在國(guó)內(nèi)也有很多的研究成果,其中的研究涉及到無(wú)約束域和 約束域的剖分算法改進(jìn)、合并算法設(shè)計(jì)、在數(shù)據(jù)劃分上改進(jìn)、在數(shù)據(jù)結(jié)構(gòu)上改進(jìn)等。芮一康 等提出了一種新的基于掃描線(xiàn)算法和分治算法的合成算法。算法兼顧了空間與時(shí)間性能, 穩(wěn)定性較高,運(yùn)行效率和魯棒性更優(yōu)。劉云等在分別對(duì)比分治算法和逐點(diǎn)插入法后,針對(duì) 兩種算法存在的缺點(diǎn)提出了一些改進(jìn)方案,主要是對(duì)逐點(diǎn)插入法中點(diǎn)的查詢(xún)和三角形定 位查詢(xún)方面進(jìn)行了改進(jìn),在點(diǎn)定位方面使用了網(wǎng)格存儲(chǔ)空間數(shù)據(jù),在三角形定位方面采用 ClockWise檢測(cè)的方向搜索技術(shù)。徐旭等在逐點(diǎn)插入算法的基礎(chǔ)上,采用格網(wǎng)的方式同三角 網(wǎng)結(jié)合建立"網(wǎng)格一點(diǎn)一三角形"之間的索引關(guān)系,從而大大提高了待插入點(diǎn)在三角形所在 位置的定位效率。袁正午等針對(duì)定位帶插點(diǎn)所在三角形效率不高的現(xiàn)狀,提出基于對(duì)待插 點(diǎn)集反復(fù)收集分配來(lái)來(lái)完成快速定位,并在數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)方式上進(jìn)行了改進(jìn),使得總體 時(shí)間復(fù)雜度為O(NlogN)。李立新等通過(guò)對(duì)已有算法的分析和借鑒,提出了兩種多對(duì)角線(xiàn)交 換算法并證明了循環(huán)算法不會(huì)存在死循環(huán)現(xiàn)象,并認(rèn)為循環(huán)算法具有編程簡(jiǎn)單和運(yùn)算速度 快的特點(diǎn)。劉少華等提出了一種CD-TIN快速內(nèi)插多邊形算法,算法流程是先將多邊形的邊 作為約束數(shù)據(jù)入網(wǎng),然后將多邊形內(nèi)部多余邊進(jìn)行清空處理,且在影響區(qū)域及多邊形內(nèi)部 三角形確定上給出了解決辦法。賈曉林等針對(duì)約束線(xiàn)端點(diǎn)不在已有CD-TIN中、約束線(xiàn)通過(guò) 三角形頂點(diǎn)、約束線(xiàn)影響域內(nèi)有其他約束邊三種特殊情況下的處理方法,并且提出了邊的 四相關(guān)局部?jī)?yōu)化算法。馬洪濱等對(duì)于約束多邊形的嵌入不在限定于規(guī)則化多邊形,研究并 給出了適用于任意多邊形(含島嶼)的三角剖分算法。宋曉眉等深入探索了 CD-TIN兩步 法,提出了采用遞歸割耳法解決影響區(qū)域包含懸掛點(diǎn)和影響區(qū)域?yàn)榘级噙呅?。顏林等針?duì) 當(dāng)前構(gòu)建約束Delaunay三角網(wǎng)的算法在影響域?yàn)榘级噙呅螘r(shí)進(jìn)行對(duì)角線(xiàn)交換可能失效的 情況下,提出若為凹多邊形則處理下一條相交邊,處理所有相交邊一遍后必會(huì)出現(xiàn)新的兩 個(gè)相鄰三角形形成凸多邊形,重新交換直到相交邊處理完為止。張?jiān)伒壤^續(xù)拓展了當(dāng)前約 束多邊形嵌入問(wèn)題,研究和改進(jìn)了線(xiàn)段相交判斷和首三角形確定問(wèn)題的相關(guān)算法,并給出 了存在重復(fù)點(diǎn)情況下的解決方案。楊琦明等在D-TIN中嵌入約束邊時(shí),引入了 Qi算法,減少 了算法的運(yùn)算次數(shù),加快了嵌入的執(zhí)行速度。任振娜在基于一次性構(gòu)建CD-TIN算法上,從 點(diǎn)數(shù)據(jù)方面入手,實(shí)現(xiàn)了快速、高效地插入點(diǎn)達(dá)到局部動(dòng)態(tài)修改的目的。曾閩山等基于格網(wǎng) 劃分的自適應(yīng)分割-合并算法,對(duì)已經(jīng)通過(guò)塊分割的格網(wǎng)數(shù)據(jù)重新排序再分割,然后以分 割的逆序方式合并各子網(wǎng)。李小麗等利用線(xiàn)性四叉樹(shù)方式將數(shù)據(jù)劃分為包含點(diǎn)數(shù)相當(dāng)?shù)母?網(wǎng)塊,接著按照自下而上的方式將各格網(wǎng)塊內(nèi)子網(wǎng)進(jìn)行無(wú)縫合并將,同時(shí)為了避免出現(xiàn)過(guò) 小銳角的情況,加入了約束角來(lái)進(jìn)行優(yōu)化。劉永和等提出了一種構(gòu)建三角形與邊之間關(guān)系 的數(shù)據(jù)結(jié)構(gòu),其中三角形包含了三邊的對(duì)象指針,而對(duì)于邊保存了左右鄰接三角形的指針。 李翔等提出了使用四方邊緣結(jié)構(gòu)來(lái)快速構(gòu)建D-TIN,并將此數(shù)據(jù)結(jié)構(gòu)應(yīng)用于具體工程實(shí)踐, 證明了該結(jié)構(gòu)的實(shí)用性和可靠性。謝增廣提出了利用雙鏈接邊表(DCEL)結(jié)構(gòu)結(jié)合分治算 法實(shí)現(xiàn)了平面點(diǎn)集的三角剖分,并對(duì)特殊情形也做了處理。
[0005] D-TIN并行算法的研究開(kāi)始于20世紀(jì)80年代末,基于分治算法的二維點(diǎn)集并行算 法就是Davy首次提出的,D-TIN并行算法研究開(kāi)始主要側(cè)重并行索引機(jī)制的研究,然而較 少涉及數(shù)據(jù)的并行劃分,數(shù)據(jù)劃分是并行算法中的一個(gè)不可缺少的步驟,每個(gè)核分配的數(shù) 據(jù)若有較大的差異,負(fù)載將達(dá)不到均衡,從而嚴(yán)重影響算法性能。國(guó)內(nèi)針對(duì)D-TIN并行算法 的研究起步較晚,且主要以集群的分布式并行環(huán)境為主,對(duì)于單機(jī)多核方面的研究并不多。
[0006] 在國(guó)外研究成果有:Kolingerovdi等介紹了一種基于Delaunay三角剖分的隨機(jī)增 量插入的并行算法,通過(guò)在多處理器工作站上測(cè)試證明算法可行、簡(jiǎn)單、易修改,并且對(duì)于 約束三角剖分或者四面體都試用。Kohout等繼續(xù)研究了隨機(jī)增量插入法,由于它的簡(jiǎn)單性 和穩(wěn)定性被應(yīng)用于E3展會(huì),并基于這種方法研究了一種新的并行算法,在計(jì)算機(jī)體系結(jié)構(gòu) 的多核處理器和共享存儲(chǔ)器環(huán)境下進(jìn)行了測(cè)試。Kohout在共享內(nèi)存系統(tǒng)的環(huán)境下,又利用 逐點(diǎn)插入算法設(shè)計(jì)了基于外接圓準(zhǔn)則的D-TIN并行算法。Foteinos等提出了三維D-TIN構(gòu) 建的并行算法,支持全動(dòng)態(tài)并行插入和刪除點(diǎn),在共享內(nèi)存下充分利用自定義內(nèi)存管理和 輕度鎖機(jī)制減少了線(xiàn)程的通信和同步成本。
[0007] 在國(guó)內(nèi)研究成果有:張三元等人最初采用分治方法,即通過(guò)對(duì)散亂點(diǎn)集的分類(lèi),在 不同處理器上分別求取分凸包,最后構(gòu)造各分凸包的公共凸包。易法令等在分布式環(huán)境中 提出了一種基于網(wǎng)格的D-TIN生成算法,算法較好的保證了負(fù)載均衡,并解決了四點(diǎn)共圓 的不唯一性和邊界處理的任意性問(wèn)題。張三元提出的凸包并行化構(gòu)造算法雖然使計(jì)算效率 有所提高,但在刪除內(nèi)點(diǎn)上需要消耗大量時(shí)間,郝小柱認(rèn)為通過(guò)采用并行的方法刪除內(nèi)點(diǎn), 對(duì)保留點(diǎn)排序形成簡(jiǎn)單有序多邊形,最后對(duì)該多邊形求取凸包,可以大大減小了時(shí)間復(fù)雜 度。范剛龍等在分布式多處理機(jī)環(huán)境下提出對(duì)數(shù)據(jù)點(diǎn)按X坐標(biāo)進(jìn)行排序,并將排序后的數(shù) 據(jù)按給定的閾值點(diǎn)數(shù)劃分,通過(guò)分配給各個(gè)線(xiàn)程生成子三角網(wǎng),相鄰三角網(wǎng)兩兩歸并;最后 獲得歸并結(jié)果。申永源等在無(wú)約束域情況下提出了用串行算法的分治特征應(yīng)用于并行生成 泰森多邊形,與串行算法相比提高了計(jì)算速度,并減少了執(zhí)行時(shí)間。馬勁松等針對(duì)線(xiàn)要素 簡(jiǎn)化存在大量計(jì)算、難以做到實(shí)時(shí)的缺點(diǎn),運(yùn)用多核并行技術(shù)實(shí)現(xiàn)了 Douglas-Peucker算 法,并在多核處理器的計(jì)算機(jī)上進(jìn)行實(shí)驗(yàn),驗(yàn)證了并行算法的效率與實(shí)時(shí)性。張曉蒙等在共 享內(nèi)存模型下通過(guò)OpenMP采用任務(wù)并行的策略研究了并行Delaunay網(wǎng)格生成算法,實(shí)驗(yàn) 結(jié)果表明與串行算法生成的網(wǎng)格在質(zhì)量上區(qū)別較小,滿(mǎn)足了大規(guī)模網(wǎng)格生成的需求。齊琳 等針對(duì)傳統(tǒng)的D-TIN并行算法尚未給出劃分結(jié)果均衡、劃分效率高效的理想解決方案情形 下,在傳統(tǒng)D-TIN并行算法規(guī)則條帶劃分方法的基礎(chǔ)上,提出采用動(dòng)態(tài)條帶實(shí)現(xiàn)針對(duì)集聚 分布點(diǎn)集數(shù)據(jù)的均衡、高效劃分方法。
[0008] (1)與本發(fā)明相關(guān)的現(xiàn)有技術(shù)一為:
[0009] 步驟1,將離散數(shù)據(jù)點(diǎn)在x、y投影平面上,沿先X方向排序,后y方向排序,將排序 結(jié)果存入數(shù)組V[0…n-1]中;
[0010] 步驟2,根據(jù)分布式環(huán)境中計(jì)算結(jié)點(diǎn)個(gè)數(shù)k及各計(jì)算結(jié)點(diǎn)的內(nèi)存和計(jì)算能力的大 小,將V[0…n-1]中的η個(gè)數(shù)據(jù)點(diǎn)分成m個(gè)對(duì)應(yīng)長(zhǎng)度的段VtS l^S1,…,Snil];
[0011] 步驟3,開(kāi)辟一數(shù)組T[0…m-l]用于記錄生成的初始子三角網(wǎng),然后以每次k個(gè)段 為單位,依次將S 1, S1+1,…,S1+k i分配給相應(yīng)的結(jié)點(diǎn),由該結(jié)點(diǎn)調(diào)用Delaunay三角網(wǎng)構(gòu)建 過(guò)程進(jìn)行構(gòu)網(wǎng),并將構(gòu)建的子三角網(wǎng)依次存入T[i··· i+k-1],換出到外存;循環(huán)上述過(guò)程, 最終將在外存中形成m個(gè)初始?xì)w并段T[0…m-l];
[0012] 步驟4,用一鏈表Τ'記錄生成的下一輪子三角網(wǎng),根據(jù)內(nèi)存的大小,依次從外存 (Τ[0…m-l])給各結(jié)點(diǎn)調(diào)入相鄰的若干個(gè)子三角網(wǎng),并由該結(jié)點(diǎn)調(diào)用子網(wǎng)歸并算法將這些 子三角網(wǎng)歸并為一個(gè)三角網(wǎng),并按分配順序依次將各結(jié)點(diǎn)合并所得的三角網(wǎng)插入鏈表尾 部,換出到外存;然后再對(duì)后面的若干個(gè)相鄰子三角網(wǎng)進(jìn)行歸并,重復(fù)上述過(guò)程直至m個(gè)三 角網(wǎng)歸并完畢為止;
[0013] 步驟5,對(duì)鏈表Τ'重復(fù)步驟4中的過(guò)程,對(duì)相鄰的子三角網(wǎng)進(jìn)行下一輪歸并,如此 經(jīng)過(guò)多輪的歸并,最終將形成一個(gè)三角網(wǎng)。
[0014] ⑵與本發(fā)明相關(guān)的現(xiàn)有技術(shù)二為:
[0015] 步驟1,把離散點(diǎn)集V所在區(qū)域D劃分成一定大小的正方形網(wǎng)格,點(diǎn)集V以網(wǎng)格為 單元進(jìn)行存儲(chǔ);
[0016] 步驟2,主控處理機(jī)求點(diǎn)集V的凸包;
[0017] 步驟3,按一定的間隔把凸包的邊傳給其它m-l個(gè)處理機(jī),并相應(yīng)建立邊表和總邊 表,把點(diǎn)集V傳送給其它m-l個(gè)處理機(jī);
[0018] 步驟4,建立總邊表Gross_EdgeTable、新邊表隊(duì)列New_EdgeQueue及每個(gè)處理機(jī) 邊表 Each_Table ;
[0019] 步驟5,每個(gè)處理機(jī)按規(guī)則從Each_Table中取出一條有向邊,尋找其右邊符合 Delaunay三角新規(guī)則的點(diǎn)P,如果該點(diǎn)存在,刪除Each_Table及Gross_EdgeTable中原來(lái) 的邊,連接點(diǎn)P構(gòu)成新的邊new_