实验七三次B样条曲线及算法实现.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验七三次B样条曲线及算法实现

实验七 三次B样条曲线的算法实现 一、实验目的 根据B样条曲线的基础知识,对3次均匀B样条曲线算法进行程序设计,验证算法的正确性,并修改程序,加深对B样条曲线数学模型的理解。 二、实验任务(2学时) B样条曲线的程序设计。 三、实验内容和实验步骤 1.算法 从三次B样条曲线的定义可知:当p=3时, Ci,3(t)=∑Pi+l Nl,3(t)= Pi N0,3(t)+ Pi+1 N1,3(t)+ Pi+2 N2,3(t)+ Pi+ 3 N3,3(t) 因为四个调和函数N0,3(t)、N1,3(t)、N2,3(t)和N3,3(t) 已知(参看教材P138-139)因此只要给出四个控制点的位置矢量的坐标,当t在[0,1]范围内取离散的100个点时(dt=0.01),分别求出每一个曲线上点,相邻点用直线段连接起来,就可以得到相应的B样条曲线。 设控制点的个数为PointNum,要求PointNum≥4,则可以生成(PointNum-3)段三次B样条曲线。其中第i段三次B样条曲线的代数形式为: Ci,3(t)x= Pi x N0,3(t)+ P (i+1) x N1,3(t)+ P (i+2) x N2,3(t)+ P (i+3) x N3,3(t) Ci,3(t)y= Pi y N0,3(t)+ P (i+1) y N1,3(t)+ P (i+2) y N2,3(t)+ P (i+3) y N3,3(t) 其中,i=1,2,…, PointNum-3 2.程序实现如下:(工程名:BSpring) (1)将调和函数定义为成员函数,函数形式如下: double CBSpringView::N03(double t) { return ((-pow(t,3)+3*pow(t,2)-3*t+1)/6);// pow()函数:求x的y次方(次幂) } double CBSpringView::N13(double t) { return ((3*pow(t,3)-6*pow(t,2)+4)/6); } double CBSpringView::N23(double t) { return ((-3*pow(t,3)+3*pow(t,2)+3*t+1)/6); } double CBSpringView::N33(double t) { return (pow(t,3)/6); } (2)编写OnDraw()函数,程序如下: int n,m,pointnum,i,j; int x[10],y[10],curx,cury; //(x[i],y[i])为顶点坐标 double t,dt; CPen PenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔 CPen PenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔 n=3; pointnum=5; //5个顶点,则绘制(5-3)=2段B样条曲线 x[1]=10;y[1]=200;x[2]=40;y[2]=100;x[3]=100;y[3]=100; x[4]=150;y[4]=150;x[5]=150;y[5]=200; //绘出特征多边形 pDC-SelectObject(PenBlue); pDC-MoveTo(x[1],y[1]); for (i=2;i=pointnum;i++) pDC-LineTo(x[i],y[i]); //绘制B样条曲线 m=pointnum-n; dt=0.01; pDC-SelectObject(PenRed); for (i=1;i=m;i++) //绘制m条(段)B样条曲线 { t=0; for (j=0;j=100;j++) // 绘制每一条(段)B样条曲线 { curx=N03(t)*x[i]+N13(t)*x[i+1]+N23(t)*x[i+2]+N33(t)*x[i+3]; cury=N03(t)*y[i]+N13(t)*y[i+1]+N23(t)*y[i+2]+N33(t)*y[i+3]; if (j==0) pDC-MoveTo(curx,cury); else { pDC-LineTo(curx,cury); t+=dt; } } } (3)编译程序,查看运行结果。 3.思考 上述程序5个控制顶点,自行修改程序,增加顶点数目分别至6个、7个、8个及9个。 3 l =0

文档评论(0)

liwenhua00 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档