基于提升
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
的蝶形细分曲面小波简化算法的实现 - Read
基于提升方法的蝶形细分曲面小波简化算法
的实现
郑贵锋
2004.1
1. 概述
该程序实现了基于提升方法的蝶形细分曲面小波简化算法,该算法可参见王建民博士论文:三维CAD中的离散体造型方法研究及应用,P71-74。
2. 程序
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
2.1 读取控制网格net模型文件
1) 从net文件读取控制网格,用ControlNet控制网类保存,ControlNet类中分别用动态数组
保存顶点、纹理与颜色:
float* verts;
float* texCoords;
float* colors;
net模型文件格式如下:
BaseTexture %s %d %d //基本纹理 名称 宽 高
GlossTexture %s %d %d //光滑纹理 名称 宽 高
EnvTexture %s %d %d //环境纹理 名称 宽 高
v %f %f %f //顶点 坐标x y z
t %f %f //纹理 坐标x y
c %f %f %f %f //颜色 R G B A
f %d %d %d %d %d %d %d %d %d %d //面 顶点索引号(至少3个,最大10个)
注: 纹理与颜色部分不是必需,但如果存在纹理或颜色,则其与顶点数目必须保持一致,并按顺序从0起编索引号,与顶点索引一一对应。
2) 调整模型顶点数据,使其居中:计算所有顶点最大最小值,以其中间值为0点调整所有
顶点坐标值。X,y,z值分别处理。
3) 调整模型比例,使其不至于过大或过小:计算顶点x,y和z坐标最大值,以(适当最大值
/原最大值)为因子乘顶点坐标更新所有顶点坐标。X,y,z使用相同因子。
1
2.2 转换成ButterflySurface类
1) 保存所有顶点、纹理、颜色数据到:
float* controlVerts; //每顶点4个float: x, y, z, ?
float* controlTexCoords; //每顶点2个float: x, y
unsigned char* controlColors; //每顶点4个单位: r, g, b, a.
2) 将每个面转为三角形片:取第0个顶点为三角形片的一个顶点,依次取2个顶点为三角
形片的另两顶点,即分别取下面索引号的顶点组成三角形片:(0, 1, 2)、(0, 2, 3)、(0, 3,
4)、…然后将每个三角形片的顶点索引号依次保存在:
int* controlFaces; //每三角形片占3个单位空间,保存的是顶点的索引,即在controlVerts中的序号
3) 将所有三角形片的边保存到下面数组里,不保存重复的边:
ButterflyEdge* controlEdges; //每条边保存的是顶点的索引
并将边的索引号保存在:
int* controlFaceEdges; //每三角形片占3个单位空间,保存的是边的索引,即在controlEdges中的序号
4) 为每个顶点生成边列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
a) 计算所有顶点法线:遍历所有三角形片,设三角形ABC,顶点A的法线为:AB叉
iii乘AC再
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
化,顶点,、,的法线与,相同。若某顶点同时在多个三角形内,则
取多次算得的法线的和,标准化后作为该顶点法线。
b) 根据之前保存的边数组controlEdges,很容易得到顶点关联的边,将每顶点的边的
索引以链表保存下来。
c) 顶点的度限制在,与MAX_VERTEX_VALENCE之间,MAX_VERTEX_VALENCE
这里设为16。
d) 将边按角度排序:第0条边的角度为0,与第0条边的顺时针角度越大排到最后。
排序方法:将边投射到切平面并标准化,计算点积即得夹角的cos值,再求acos即
得角度值,注意若两者的叉积与法线异向时,求得角度应被360减,因我们要算的
是顺时针角度。
e) 将排序后的边保存在:
VertexEdges* controlVertEdges; //每单位保存的是一个顶点的已排序的边的索引值。
5) 以上得到的都是控制网格的数据,现在将其简单复制到显示时实际用到的数组中:
float* verts; //复制自controlVerts
2
VertexEdges* vertEdges; //复制自controlVertEdges
float* texCoords; //复制自controlTexCoords
unsigned char* colors; //复制自controlColors
int* faces; //复制自controlFaces
int* faceEdges; //复制自controlFaceEdges
ButterflyEdge* edges; //复制自controlEdges
2.3 简化曲面
1) 简化曲面
a) 分裂(Split)过程:设第0顶点作为偶点,则它周围的6个顶点为奇点,然后在这
些奇点的外围把与偶点对称的位置上的那6个顶点找出,递归地把这些顶点设为偶
点。奇偶性保存在:
int* vertEven; //每顶点占一单位. 1 : 奇 0 : 偶 -1 : 未分类
b) 在分裂过程的同时,要将被划为偶点的顶点作为预测顶点分类记下来,以方便预测
过程计算:开始被设为偶点的那个顶点,即为周围6个奇点的蝶头顶点([1]中的v
顶点),不妨将周围6个奇点和外围的6个偶点对应地围绕中间的偶点顺时针编号。
则第i个偶点为第i个奇点的蝶尾顶点([1]中的v顶点),亦为第(i+1 mod 6)或(i-1 mod
6)个奇点的蝶侧顶点([1]中的f顶点),亦为第(i+2 mod 6)或(i-2 mod 6)个奇点的翅
尖顶点([1]中的e顶点)。预测顶点索引保存在:
int* vertPredict; //用于保存奇点的8个蝶形预测顶点。
// v1,v2: 与奇点同边的两端顶点,或者说是蝶头尾顶点
// f1,f2: 蝶翅膀边缘中点上的两个顶点,蝶侧顶点。
// e1,e2,e3,e4: 四个翅膀尖上的顶点,翅尖顶点。
c) 预测(Predict)过程:遍历所有顶点,是奇点才预测,其差按下
公式
小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载
计算:
diffVerts = 1/2*(v1+v2) + 2*w*(f1+f2) - w*(e1+e2+e3+e4)。
W取值1/16, 结果保存在:
float* diffVerts; //保存预测过程中的奇点的差,每顶点占4个float: x, y, z, ?
d) 更新(Update)过程:遍历所有顶点,是偶点才更新,找偶点周围的六个顶点,分
别将乘以系数A,加到偶点上。
e) 最后,将奇点丢掉,保存奇点的差,保留偶点,将偶点重新连接成新边,组成新三
角形片。
2) 显示新曲面。
3
参考文献
[1] 王建民,三维CAD中的离散体造型方法研究及应用,博士学位论文,中山大学, 2003, 71-74
i 叉乘:设矢量V1=(x1,y1,z1), V2=(x2, y2, z2). 则V1叉乘V2为矢量: (y1*z2-z1*y2, z1*x2-x1*z2, x1*y2-y1*x2).
点乘:设矢量V1=(x1,y1,z1), V2=(x2, y2, z2). 则V1点乘V2为标量: x1*x2 + y1*y2 + z1*z2. 点乘亦表示:|V1||V2|cos(a), 其中a为V1、V2夹角 ii 标准化:设矢量V=(x,y,z),其标准化矢量是指:(x/d, y/d, z/d), 其中d为x, y, z的平方和再开方,d即是V的度量。
4