为了简化算法实现的效率问题,使用本组关于Galand算法的一种实现:
1、取边收缩的误差矩阵Q为边的俩顶点收缩的误差矩阵Qi和Qj之和,即(Q=Qi+Qj)。
2
、取新顶点位置为收缩边(i,j)中的一个,误差由公式计算得到,具体的选择由i
收缩到j的所产生的误差和由j收缩到i所产生的误差值做比较得到的较小值决定。 3、实际边收缩带来的结果是 删除一个点,删除一条边,删除俩个与边关联的三角形,增加新边、三角形。
具体算法步骤如下:
步骤1
根据给定的模型数据,计算出所有顶点的顶点误差矩阵Qi:为各平面对应的a、b、c关联矩阵的和:
计算过程涉及求面的a、b、c(注意满足)
,即为面的单位法向量,单位法向量的求法可根据平面俩点的叉乘在单位化即可。 步骤2 设计一关于结构体的优先队列来简化堆的操作,存放i,j,及其收缩带来的误差,代表从i折叠到j的误差,并设计一哈希表用于判定是否新边。
步骤3 计算边折叠误差:根据步骤2,取边折叠从i到j和从j到i的教小者作为该边的误差入队并进入哈希散列。
步骤4 选择队列中的队头元素q出队(即代表从q.i折叠到q.j)。
步骤5 判断i,j同时相关的三角形的个数:如果个数大于1,那么删除与i,j同时关联的三角形,删除点i,进行边收缩(将剩余三角形中与i相关的三角形全部转移到与j相关),并往队列中增加由于折叠带来的新边(做与步骤3相同的操作),否则转步骤4。
步骤6 如果边收缩达到给定的收缩哦边的个数,则结束收缩,否则转步骤4。