您现在的位置:机电论文网>> 机床加工>> 正文内容

nurbs曲线、曲面造型过程的可视化设计* **

作者: 来源: 发布时间:2018/2/11 16:12:47  点击数:481
1 nurbs曲线、曲面造型方法
1.1 nurbs曲线方程
一条p阶nurbs曲线被定义作:

式中:{pi}——控制点(形成控制多边形);
{ωi}——权因子;
{ni,p(u)}——p阶b样条基函数,其节点矢量为:
u={a,…,a,up+1,…,um-p-1,b,…,b}
除非另述,一般假定a=0,b=1及对于所有的i都有ωi>0。
令:
则nurbs曲线方程还可写作:

1.2 nurbs曲面方程
u向p阶、v向q阶的nurbs曲面定义为:

式中:{pi,j}——构成曲面控制点网;
{ωi,j}——权因子;
{ni,p(u)}、{nj,q(v)}——p阶、q阶b样条基函数,其节点矢量为:
u={0,…,0,up+1,…,ur-p-1,1,…,1}
v={0,…,0,vq+1,…,vs-q-1,1,…,1}
这里,r=n+p+1,s=m+q+1。
令:
nurbs曲面方程还可写作:

2 nurbs曲线、曲面的数据结构
nurbs曲线的属性信息有:次数k,控制点d,权因子w和节点矢量u。nurbs曲面的属性信息有:次数k、l,控制点di,j,权因子wi,j和节点矢量u,v。能否管理好nurbs曲线、曲面,取决于能否对这些属性信息进行有效的组织和管理。而要对曲线、曲面进行方便、有效的管理和计算,良好的数据结构是必不可少的。
nurbs曲线、曲面数据结构图如下:

nurbs数据结构图

nurbs曲面数据结构图
这种数据结构形式具有如下几个优点:
(1)运算灵活,便于修改;
(2)易于检索、提高运算速度;
(3)结构简单、便于维护。
3 曲线、曲面数据结构的编程实现
不难看出,上述曲线、曲面数据结构均为双链表结构,并且链表内还包括若干个双链表,如控制点链表、节点链表等。传统的用c语言实现的双链表结构突出的缺点是不直观,编程比较复杂。因此本文采用vc++指针类型的集合样板类实现这种双链表结构,使得对链表中节点的插入、删除和修改非常直观。
3.1 用vc++表示的nurbs曲线的数据结构:
class curve{
public:
int curveno; /*曲线号*/
int k; /*曲线次数*/
controlpointcp; /*控制点指针*/
knotvectorkv; /*节点矢量指针*/

class controlpoint

public:
int vertexno; /*控制点序号*/
double vertex[3]; /*控制点坐标*/
double weight; /*控制点权因子*/
public:
void formatcontrol(cstring& str);
};
class knotvector

public:
int knotno; /*节点序号*/
int multiplicity; /*节点重复度*/
double knotvalue; /*节点值*/
public:
void formatknot(cstring& str);
};
3.2 用vc++表示的nurbs曲面的数据结构
class surface

controlpoint*up;
controlpoint*vp;
knotvector*ku;
knotvector*kv;

3.3 用vc++指针类型的集合样板类实现双链表结构
我们以控制点链表为例,说明如何用vc++指针类型的集合样板类ctypedptrlist来实现双链表结构。
typedef ctypedptrlist<cptrlist,controlpoint>mytypedptrlist;
mytypedptrlist controlpointlist;
那么controlpoint__list为一个空的双链表。我们可以用ctypedptrlist类中的成员函数addtail()、removetail()、insertbefore()、insertaft-
er()、getnext、getprev等对表中的数据进行添加、插入和删除等操作。
例如向表中添加一个控制点:
controlpoint*pcontrol=new controlpoint;
pcontrol->vertexno=m_vertexno;;
pcontrol->vertex[0]=m_vertexx;
pcontrol->vertex[1]=m_vertexy;
pcontrol->vertex[2]=m_vertexz;
pcontrol->weight=m_weight;
controlpoint_list.addtail(pcontrol);
如果插入一个控制点:
controlpoint_list.insertbefore(pos,pcontrol);
如果删除一个控制点:
controlpoint_list.removeat(pos,pcontrol);
因此用vc++指针类型的集合样板类ctypedptrlist对双链表进行操作简单、直观,不容易出错。其它链表均可照此处理。

图1 控制点对话框
4 控制点、节点的可视化实现
为了能够实现对控制点、节点链表实时进行插入、删除和修改等操作,将这些操作同对话框联系起来。也就是说,对对话框上控件的操作,就相当于对控制点、节点链表进行相应的操作,从而使对控制点、节点链表实时进行插入、删除和修改等操作的过程可视化。
我们以控制点链表和对话框之间的联系为例,说明利用vc++实现控制点链表的插入、删除和修改等操作过程的可视化。
(1)建立如图1所示的对话框,对话框中有按钮add、insert、update、removeat、removeall,可对控制点链进行操作;有组合框可显示控制点链表中的数据;
(2)建立与对话框相联系的类cmodifiervertex,同时编写与按钮相关的成员函数onadd()、oninsert()、onupdate()、onremoveat()和onremoveall();
(3)将控制点链表中的数据在组合框中显示出来。以添加操作为例,vc++代码如下:
void cmodifiervertext::onadd()

∥todo:add your control notification handler code here
if(updatedata()!=true)
return;
controlpoint*pcontrol=new controlpoint;
pcontrol->vertexno=m_vertexno;;
pcontrol->vertex[0]=m_vertexx;
pcontrol->vertex[1]=m_vertexy;
pcontrol->vertex[2]=m_vertexz;
pcontrol->weight=m_weight;
controlpoint_list.addtail(pcontrol);
addtolistbox(pcontrol); /*将数据添加到组合框*/

这样无论何时按系统菜单modifier中的下拉菜单vertex,都会看到控制点的数值、个数,为造型提供参考。
5 实例
利用可视化方法建立nurbs曲线、曲面造型系统,对哈尔滨制氧机厂加工的叶轮进行三维实体造型,并通过vc++调用opengl图形库中的函数对其进行渲染,完成后如下图2所示,同时提供数控加工数据。

图2 叶轮的nurbs造型
6 结论
(1)运用vc++指针类型的集合样板类ctypedptrlist处理双链表的新方法,使得对双链表的操作变得简单、直观;
(2)由于造型过程的可视化,使设计者可随时按要求修改、插入和删除控制点、节点而达到设计要求。
** 博士学科点专向科研基金(资助号:98021332)资助项目。
作者单位:哈尔滨工业大学机电学院 哈尔滨 150001
参考文献
1 les piegl wayne tiller.the nurbs book,1995
2 ori gurewich,nathan gurewich.精通visual c++2.0 for windows95.学苑出版社,1995
3 microsoft corporation.visual c++2.0 for win32大全
(二)——用mfc和win32编程.清华大学出版社,1996
4 孙家广等.计算机辅助几何造型技术.清华大学出版社,1988
5 jackie neider,tom davis,mason woo.opengl program-ming guide.addison welsey,1993
6 silicon graphics,inc.opengl refrence manual.addison
welsey,1993

更多
字体:【】-【】-【】【关闭此页

上一篇:关节型机器人小臂平衡机构新探*'   下一篇:用假设的显著性检验保证系列产品的综合'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。