数据结构建立算法:
第 1 步:根据 STL 格式的数据文件建立顶点和边的存储结构。
其算法如下:
(1)扫描 STL 格式的文件,读一个三角面片的信息;
(2)读第一个顶点时,扫描顶点顺序表,根据顶点的值看是否已有该顶点。若无该顶点,则为该顶点生成一个新的 id 号,并把该顶点存入顶点顺序表中;若有该顶点则不再存入该顶点。最后,把第一个顶点的 id 号存储到临时变量 f1 中;
(3)读第二个顶点时,扫描顶点顺序表,根据顶点的值看是否已有该顶点。若无该顶点,则为该顶点生成一个新的 id 号,并把该顶点存入顶点顺序表中;若有该顶点则不再存入该顶点。最后,把第二个顶点的 id 号存储到临时变量 f2 中;
(4)读第三个顶点时,扫描顶点顺序表,根据顶点的值看是否已有该顶点。若无该顶点,则为该顶点生成一个新的 id 号,并把该顶点存入顶点顺序表中;若有该顶点则不再存入该顶点。最后,把第三个顶点的 id 号存储到临时变量 f3 中;
(5)生成第一条边的结点,并把它链入以第一个顶点为表头的链表中。该边的
flag=0,sid=f1,eid=f2,nsid=f2,neid=f3;
(6)生成第二条边的结点,并把它链入以第二个顶点为表头的链表中。该边的
flag=0,sid=f2,eid=f3,nsid=f3,neid=f1;
(7)生成第三条边的结点,并把它链入以第三个顶点为表头的链表中。该边的
flag=0,sid=f3,eid=f1,nsid=f1,neid=f2;
(8)若 STL 文件没有读完则转⑴,否则算法结束。
第 2 步:采用快速排序算法,对顶点结点按照 z 的值从小到大进行排序。拓扑结构建立后,对三角面片数据做排序处理,依据每个三角形顶点 z 值排序,按z 值从小到大排列有序,考虑到时间、空间复杂度和排序效率。排序算法采用快速排序法。定义顶点顺序表为 Cvertex Lvertex[n],首先任意选取一顶点 z 值(可选第一个顶点
Lvertex[0].Vz)作为枢轴,将所有小于枢轴顶点的顶点(这里顶点为顶点的 Vz 值,下同为 Vz)放置在它之前,将所有大于枢轴顶点的顶点放置在它之后。按照这种规则可将所有顶点以枢轴为分间线分割为两个子序列,{Lvertex[s].Vz, Lvertex[s+1].Vz,...,
Lvertex[i-1].Vz }和{Lvertex[i+1].Vz, Lvertex[i+2].Vz,..., Lvertex[m].Vz },则可完成一趟快速排序过程;然后按照这种规则分别对两个子表再一次进行排列,递归下去;最后直到将所有的顶点依照顶点的 Vz 值排列有序。
其一趟排序过程:
(1)附设两个指针 low 和 high,初值分别为 low=0,high=n;
(2)设枢轴顶点为 pivotkey,初值为 pivotkey=Lvertex[0].Vz;
(3)从 high 的位置向前搜索找到第一个小于 pivotkey 值的顶点且和枢轴顶点交换数据;
(4)从 low 的位置向后搜索找到第一个大于 pivotkey 值的顶点且和枢轴顶点交换数据;
(5)当 low!=high 循环第(3)步和第(4)步。
|