數(shù)據(jù)結(jié)構(gòu)建立算法:
第 1 步:根據(jù) STL 格式的數(shù)據(jù)文件建立頂點(diǎn)和邊的存儲(chǔ)結(jié)構(gòu)。
其算法如下:
(1)掃描 STL 格式的文件,讀一個(gè)三角面片的信息;
(2)讀第一個(gè)頂點(diǎn)時(shí),掃描頂點(diǎn)順序表,根據(jù)頂點(diǎn)的值看是否已有該頂點(diǎn)。若無(wú)該頂點(diǎn),則為該頂點(diǎn)生成一個(gè)新的 id 號(hào),并把該頂點(diǎn)存入頂點(diǎn)順序表中;若有該頂點(diǎn)則不再存入該頂點(diǎn)。最后,把第一個(gè)頂點(diǎn)的 id 號(hào)存儲(chǔ)到臨時(shí)變量 f1 中;
(3)讀第二個(gè)頂點(diǎn)時(shí),掃描頂點(diǎn)順序表,根據(jù)頂點(diǎn)的值看是否已有該頂點(diǎn)。若無(wú)該頂點(diǎn),則為該頂點(diǎn)生成一個(gè)新的 id 號(hào),并把該頂點(diǎn)存入頂點(diǎn)順序表中;若有該頂點(diǎn)則不再存入該頂點(diǎn)。最后,把第二個(gè)頂點(diǎn)的 id 號(hào)存儲(chǔ)到臨時(shí)變量 f2 中;
(4)讀第三個(gè)頂點(diǎn)時(shí),掃描頂點(diǎn)順序表,根據(jù)頂點(diǎn)的值看是否已有該頂點(diǎn)。若無(wú)該頂點(diǎn),則為該頂點(diǎn)生成一個(gè)新的 id 號(hào),并把該頂點(diǎn)存入頂點(diǎn)順序表中;若有該頂點(diǎn)則不再存入該頂點(diǎn)。最后,把第三個(gè)頂點(diǎn)的 id 號(hào)存儲(chǔ)到臨時(shí)變量 f3 中;
(5)生成第一條邊的結(jié)點(diǎn),并把它鏈入以第一個(gè)頂點(diǎn)為表頭的鏈表中。該邊的
flag=0,sid=f1,eid=f2,nsid=f2,neid=f3;
(6)生成第二條邊的結(jié)點(diǎn),并把它鏈入以第二個(gè)頂點(diǎn)為表頭的鏈表中。該邊的
flag=0,sid=f2,eid=f3,nsid=f3,neid=f1;
(7)生成第三條邊的結(jié)點(diǎn),并把它鏈入以第三個(gè)頂點(diǎn)為表頭的鏈表中。該邊的
flag=0,sid=f3,eid=f1,nsid=f1,neid=f2;
(8)若 STL 文件沒(méi)有讀完則轉(zhuǎn)⑴,否則算法結(jié)束。
第 2 步:采用快速排序算法,對(duì)頂點(diǎn)結(jié)點(diǎn)按照 z 的值從小到大進(jìn)行排序。拓?fù)浣Y(jié)構(gòu)建立后,對(duì)三角面片數(shù)據(jù)做排序處理,依據(jù)每個(gè)三角形頂點(diǎn) z 值排序,按z 值從小到大排列有序,考慮到時(shí)間、空間復(fù)雜度和排序效率。排序算法采用快速排序法。定義頂點(diǎn)順序表為 Cvertex Lvertex[n],首先任意選取一頂點(diǎn) z 值(可選第一個(gè)頂點(diǎn)
Lvertex[0].Vz)作為樞軸,將所有小于樞軸頂點(diǎn)的頂點(diǎn)(這里頂點(diǎn)為頂點(diǎn)的 Vz 值,下同為 Vz)放置在它之前,將所有大于樞軸頂點(diǎn)的頂點(diǎn)放置在它之后。按照這種規(guī)則可將所有頂點(diǎn)以樞軸為分間線(xiàn)分割為兩個(gè)子序列,{Lvertex[s].Vz, Lvertex[s+1].Vz,...,
Lvertex[i-1].Vz }和{Lvertex[i+1].Vz, Lvertex[i+2].Vz,..., Lvertex[m].Vz },則可完成一趟快速排序過(guò)程;然后按照這種規(guī)則分別對(duì)兩個(gè)子表再一次進(jìn)行排列,遞歸下去;最后直到將所有的頂點(diǎn)依照頂點(diǎn)的 Vz 值排列有序。
其一趟排序過(guò)程:
(1)附設(shè)兩個(gè)指針 low 和 high,初值分別為 low=0,high=n;
(2)設(shè)樞軸頂點(diǎn)為 pivotkey,初值為 pivotkey=Lvertex[0].Vz;
(3)從 high 的位置向前搜索找到第一個(gè)小于 pivotkey 值的頂點(diǎn)且和樞軸頂點(diǎn)交換數(shù)據(jù);
(4)從 low 的位置向后搜索找到第一個(gè)大于 pivotkey 值的頂點(diǎn)且和樞軸頂點(diǎn)交換數(shù)據(jù);
(5)當(dāng) low!=high 循環(huán)第(3)步和第(4)步。
|