




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、贵州大学实验报告学院:计算机科学与信息 专业:计算机科学与技术班级:计科101姓名实验时间喻志华学号1008060024实验组2013/5/19指导教师吴云成绩实验项目名称曲线、曲面的生成算法(bqzier曲线)实验0的1 >通过实验,进一步理解和掌握生成h erm it > bezier和b样条曲线及bezier曲面 的生成算法2、掌握hermit a bezier b样条曲线及bezier曲面的基本生成过程3、通过编程,会在一种语言环境下编程实现三次hermit>bezier样条曲线及bezier 曲面的绘制实验要求1、编程实现hermit曲线的绘制;2、编程实现b样条曲
2、线的绘制。3、编程实现bezier曲线的绘制。4、编程实现bezier曲面的绘制。1. 3次hermite样条曲线(1) .将参数样条曲线中的参数区间进行 等距参数化,即令li长度归一化为lo就 得到hermite曲线。(2) .用其端点位矢pi(0)、pi和切矢pi'(0)和pi'描述。实验原理记为:g二am求解得:a=g mh_10-32003-201-21_00-11p= at = gmht = gbh /g0?1bh =mht ='2t3 -3t2 +f-2t3 + 3t2t3-2t2 +tt3 -t2令:代(0 = 2尸一3尸+ 1耳() = 2尸+3厂go(
3、7)=尸2广+fg() = /3(2可将其简记为:pqxfqpo +fypy +g°九 +g&t e 0?l十bh上式是三次hermite(ferguson)曲线的几何形式。几何系数是po、pl、p'o、p'l。fo, fl, go, g1称为基函数/调和函数。(3) .每一段hermite曲线就是控制点po、pl、p' 0、p' 1的加权和,权值由基函 数f0, fl, go, g1确定。通过增加顶点并指定相应的切矢,就可得到分段 hermite样条曲线。2、bezier 曲线(1) 基本构型原理是:a. 两点p0、p1确定一条直线,表示为一
4、次参数方程:p=po+(pl-po)tb. 三点确定一条二次曲线:p=(l-t)2p0+2t( 1 -t)p 1 +t2p2,c. 三个点po, pl, p2称作顶点,屮间顶点pl不但控制曲线的首末端切矢(方向和大小),而且唯一确定曲线的形状°d. 以此类推,n+1个顶点唯一确定一条n次曲线。顶点p(),pl,.,pn的第一条边p0p1决定曲线的一阶导矢,第1, 2条边决定曲线的二阶导矢, 第1, 2, 3条边决定曲线的三阶导矢.(2) .曲线方程中,各顶点的系数与二项式(lt)n的展开式相似,在函数逼近论中,称这种系数函数为bernstein基函数。(3) .给定空间n+1个点的位
5、置矢量pi (i二0,1,2,n)则bezier曲线可定义为:%)几i=0其中,pi构成该bezier曲线的特征多边形,b讽t)是n次bernstein基函数:(1 一旷(心0丄/;0° =1,()! = 1)(4).3次bezier曲线pc(f) =-尸+3严一3/ + 1 3尸-6/2 + 3/-3尸+ 3厂t33. b样条曲线(1) .在bezier曲线方程屮,用b样条基函数代替bernstein基函数,就得到b样条曲线。(2) . b样条曲线的突出优点是对曲线的局部修改功能,因为b样条曲线是分段组成的(很容易产生c2连续性),所以控制多边形的顶点对曲线的控制灵活而直观。(3)
6、 . b样条曲线的次数可根据需要指定,不像beziei曲线的次数是由控制点的个数来确定。(4) . b样条曲线的方程定义为:给定空间n+1个点pi(i=0,l,2,.,n),及参数节点向量:t=ti(ti ti+1,匸0,1,2,由下式定义的曲线p 称为k阶(k-1次)b样条曲线:弘)=工少/),虫s+jz=o£(z = 0,1,)是控制多边形的顶点ni©(i=o,i,m为k阶(k次)b样条基函数阶数k,控制顶点数n+1,节点个数m+1,具有以下关系:m二n+k 记 t 为:tn,k=ti(tiwti+l ,i=0,1,2, ,n, ,n+k)(4) bezier 曲面(1
7、) .给定空间16个位置点fij,可以确定一张三次bezier曲面片:(2) .首先生成四条v向的三次bezier曲线:(3) .根据“线动成面”的思想,取v*go,l,在四条v线上取点为控制点,沿 u向生成三次bezier曲线:(4) .将u,v向曲线方程合并得33 3旳) = 丫仍)竝 3()=hd,3(")%d,3w)z=0i=q j=0(5) . 3次bezier曲面的矩阵表达式:33 3戸仏巧=£%e)$,3(")=££竝3(")心刀巧,3(巧;s丘°2=02=0 /=0_ 10000rg21-33-1t二卩 u
8、ir-3300斤20363va3-630忌2003- 3v2-13-31卫。忌20001v3微型计算机、vc+程序设计环境1. 新建工程命名"heyjiehennite”实 验 步 骤2. 在fileview中heyji ehermit eview, h中添加3中曲线与一个曲血实现所使用的各变量与各口的函数。如图:仃).ttdefine afx_hevjtehermiteuiewh_f6234be ttinclude 忻d.h“包含三维坐标点娄 ttinclude "p2d川7/包吾二维坐标点类 ftif _msc_uer > 1000绘制bcriza曲面使用,这两个
9、类后面来添加。(2)./ operations public: /hernite 曲线 uoid multimatrix(int a449int42); uoid hernite(cdc*pdc);/bezier 曲线 uoid drawcharpolygono ;纟令制特征多边形函数 int factorial(int n);阶乘函数 double cnk(const int &n vconst int &i) ;/bernstein第一项 uoid drawbezier();绘制bezier函数b 样条曲线uoid b3_curues(char pflag.long xq
10、2 »cdc*pdc);/绘制b样条曲线/bezier 曲面 uoid getmaxv();/获得屏惡的曇大頓函数_ uoid getmaxxo;/获卷屏幕的龜大*值函数 uoid readpoint();/ia特征多込形的顶点 uoid transform3dto2d();二维点变茯为三维点 uoid drawctrpi ();从左到右的画扌空制多边形 uoid drawctrp2();/从前到后画?空制多边形 uoid line(cpoint p);/绘制特征多边形 uoid drawbezierface();绘制bezier曲面 uoid calculate1(double m
11、04,p3d pq町两个矩昨招乘 uoid calculate2(p3d p04,double 附4);两个拓阵*蘇 uoid keep0riginalmatrix(p3d 0rig449p3d dest44); uoid matrixrotate(double矢e阵转置uoid signctrpoint();标注点不同的曲线曲面的绘制将使用的函数在头文件屮的声明。.protected:/hermite 曲线int p192;int p292;double result42;/bezier 曲线bool flag;/标志cpoint *pt;/顶点int ctrlpoint;/控制多边形顶点/
12、7/8芹条曲线boolmabletoleftbtn标左键有玻boolmabletomoue; 鼠荡煮有圾int; / /控制点巫标编寻cdcn_pic;/双缓程图片longp92;鼠标点/bezier 曲面int maxx,maxv;/屏幕x和y的最大坐标p3d p3d44;/三维顶点p2d p2d44;/二维顶点p3d t44;/临时矩阵double mt44;/m的转置矩阵/清屏使用boolbyangt;bool hermit;bool berizaface;不同曲线曲面在绘制过程中将使用到的变量,其中最后三个布尔变量,用于控制单 文档在初始化时的现实,最开始要在cheyjiehernii
13、teview ()函数中,将其初始化 为假,使开始运行程序时,什么都不显示。cheyjieherniteuiew:cheyjieherniteuiew()</ todo: add construction code herebyangt=false;hermit=f:alse;berizaface=false;/3. 在视图的源文件中,対头文件中声明的各变量初始化:(1)首先在cheyjiehermiteviewo中初始化变来那个cheyjieherniteuiew:cheyjieherniteuiew()</ todo: add construction code here/“用
14、于在 ondrau 函数中显示图形的扌空制 byangtfalse;hernit-false;berizaace=false; /hernite 曲线的变量初始化 p10o=510;p101=550;p110=260;p111=368;p120-510;p121-316;p130=360;p131=162;p140-560;p141-50;p15o=760;p151=162;p160-610;p161-316;p170=860;p171=386;p180=610;p181=550;p2oo-100; p210=10o; p220=1o0; p230=100; p240»-100 p2
15、50-1o9 p260=-100 p270 100 p280=-100p201100; p211=-100; p221=-100; p231=-100; p241=-100; p251-100; p261=100; p271-10o; p281=-10o;/brzierrttl-w-/#/</ 八.uuaih vx, j». ivj au ku flag=false;/brzier 曲面的变量初始化n fibletoleftbtn=false; m_abletomoue-false;万9个顶点的初始化po0=5o;p01=350;p1o-1oo;p11-250;p2o=20o;
16、p21=350; p30=278;p31=167;p40=375;p41=440; p50=5oo;p51=25o; p60-532;p61-40; p7o=650;p71=450; p80=750;p81=350;/(2) 在ondraw函数屮添加代码uoid cheyjieherniteuiew:ondrau(cdc» pdc)< /hermite 曲线 if(hernit)<cheyjieherritedoc* pdoc = getdocunent();assert_ualid(pdoc);/ todo: add draw code for natiue data
17、herecpen mypenf* poldpen;hypen.createpen(psasolid 93 9rgb(0v 09 0): p01dpen=pdc->select0bject(6mypen): pdc->moueto(p10081); pdc->ellipse(p100-2,p101-2,p1o0*2fp1o1*2);for(int i=1 ;i<9;i+)< pdc->lineto(p1i0,p1i1j);pdc->ellipse(p1i0-2,p1i1-2,p1i0*2,p1i(1*2);> pdc->selectobjec
18、t(poldpen);mppen.deleteobject();if(byangt)<crect rect;getclientrect(&rect) ;/户区的大小cbitnap «pbitnapvbitniap;bitmap.loadbitnap(idb_bithap2);cdc kdc;mdc.createcorpatibledc(getdc(); pbitnap-hdc.selectobject(&bitnap);mdc.bitblt(o,o,rect.width(),rect.height()»&m_pic,o»otsrcco
19、pv);cpen mypenl,*p0ldpen1;mypen1.createpen(ps_solid,3frgb(0,0,255);/蓝色笔绘制控制多边形 p0ldpen1-hdc.selectobject(&mypen1);mdc.moueto(p0otp01);mdc.ellipse(p00-2,p01-2,po0*2,po1*2);/ 绘制控制多边形顶点 for(int i-1 ;i<9;i*)<mdc丄ineto(pi0,pi1); mdc.ellipse(pi0-2,pi1-2,pio*2>pi1*2);>1)<cstring str;str.
20、format(mx-%d y塔d,拖动鼠标移动此点,pn_i0 ,pn_i1);kdc.textout (pfmiko *5 tpn_i1*5fstr);/brzier 曲面if(berizaface)<getmaxx();getmaxv();cpen mypen3d,mypen2d,mypen,*01dpen;mypen3d.createpen(ps_solid,3,rgb(0,0,255); 01dpen=pdc->select0bject(&mypen3d);pdc->moueto(maxx/2,maxv/2) ;/绘制评由 pdc->lineto(max
21、x-25,maxv/2);pdc->text0ut(maxx-5®fmaxy/2-20/y);pdc->moueto(maxx/2,maxv/2);绘制2$由 pdc->lineto(maxx/29s);pdc->textout(maxx/2-20»10f#,zte);pdc->moueto(maxx/2,haxv/2);/ 绘制時由 pdc->lineto(maxx/2-maxv/2 ,maxv);/ 角为 135。 pdc>tgxtoutxm3*x/2-m3xy/250axy-30,x); pdc->textout(max
22、x/2-20>maxv/2-1of-o-);pdc->select0bject(01dpen);hypen3d.deleteobject();只有当其对应布尔值为真时,才显示相应的初始化时的图形,因此,在点击button, 调用菜单函数是才会将其对应bool值设为真。4. 为各曲线曲面在view, cpp文件屮添加在头文件屮声明了的函数代码:(1). hermite曲线的函数的函数体。/ hermit 相关函数 uoid cheyjieherniteuiew:hernite(cdc*pdc)/绘制hernite曲线<int a44-2,-1 >,0»0,1,0
23、,0,0 ;/mh0系数int b42;/边界点for(int i=0;i<8;i*)uoid cheyjiehermiteuiew:multimatrix(int a44 ,int b42)/矩阵乘法 <int i,j,k;for(i=0;i<4;i+) for(j-0;j<2;j*)心=矩阵清零for(i=0;i<2;i*)for(j=0;j<4;j*) for(k=0;k<4;k*) resultji*=ajk*bki;(2). bezier曲线的函数的函数体.a. 绘制bezier函数/ 制 bezier uoid cheyjiehermite
24、uieu :drawbezig")/绘制bezier曲线<cclientdc dc(this);double x9y;int rate=808,n;n=ctrlpoint-1;for(double;t*-1.0/rate)<x=0;y=0;for(int i=0;i<=n;i+)<x*-pti.x*cnk(nfi)*pow(t »i)*pow(1-t fn-i); y*-pti.y*cnk(n,i)*pow(t,i)*pow(1-t,n-i);>de.setpixel(round(x),round(y),rgb(50,0,210); 曲线颜色&
25、gt;b. 绘制控制多边形函数:uoid cheyjieherniteuiew:drawcharpolygon()/绘制控制多边形<jcclientdc dc(this);cpen mypen,*p01dpen;mypen.createpen(ps_solid,3,rgb(200,100,0);/ 控制多边形 p01dpen=dc.selectobject(&mypen);for(int i=0;i<ctrlpoint;!)c. bernstein第一项与阶乘函数double cheyjieherniteuiew:cnk(const int const int &i
26、)/bernstein第一项return double(factorial(n)/(factorial(i)»factorial(n-i);int cheyjieherniteuiew:factorial(int m)/阶乘函数<int f=1;for(int i=1;i<=r;i*)f*=i;return f;d. 添加lbottondown函数,如图:uoid cheyjieherniteuiew:onlbuttondown(uint nflags, cpoint point)/ todo: add your message handler code here and
27、/or call defaultcuiew:onlbuttondown(nflags, point); if(flag)<ptctrlpoint .x-point.x; ptctrlpoint .y=point.y; if(ctrlpoint<n_max_point) ctrlpoint*;elser.添加rbuttondown函数,并添加代码:uoid cheyjiehermiteuiew:onrbuttondown(uint nflags, cpoint point)</ todo: add your message handler code here and/or ca
28、ll default flag=false;drawbezier();cuiew:onrbuttondomn(nflags9 point);x(3) 三次b样条曲线a. 其绘制函数“/“谢铮 绘制相关函数 uoid cheyjiehernlteuiew: :b3 curues(char pflag.long xq 2 ,cdc *pdc)/绘制三次b样条曲线<int ifrate=10;/rate是平滑程度long lx9ly;double f039f139f23vf33;lx-round(xqo0*4.8«xq1o*xq28)/6.o);/t= 0 旳屉,克 x 半标b.uo
29、id cheyjieherniteuiew:onmousemoue(uint nflags, cpoint point)/ todo: add your message handler code here and/or call default if(m_abletomoue=true)pm_i0=point.x; pfm iini=point.u;mfc classwizardmessage maps member variablesautomation activex events class infoproject:(hcyjichcrmitcclass name:f |chcyjieh
30、crmiteviewe:v.heyjiehermiteview.h/ e:.aheyjiehermiteview.cppobject ids:messages:neyjienermiieview id id id id id idadd class.add functionapp_about app edit edit edit editexit copy cut paste undowmmousemovewm mousewheelwm movewm paintwm_rbuttondblclk wm_rbuttondownqwmr buttonupqqclctc functionedit co
31、demember functions:w onmcnubonjdmenubzcommandw onmousemoveon wm mousemovev onprepareprintingw onrbuttondown on wm rbuttondownon_wm rbuttonupdescription: indicates when the right mouse button is released确定取消uoid cheyjieherniteuiew:onlbuttonup(uint nflags, cpoint point)</ todo: add your message han
32、dler code here and/or call default n_abletoleftbtn=false;m abletomoue=false;m_i=0;cuiew:onlbuttonup(nflags» point);b. 在己经建立的lbuttondown中添加,相关b样条曲线的代码:/b 样条的 leftbottondown if(n_abletoleftbtn=true)m_abletomoue-true;>/ cuiew: :onlbuttondovn(nflags, point);c. 插入资源bitmapm _| muucicraiur 白臼bitmap
33、| i錮 idb_bitmap1|$ 锂 idb_bitmap2$ o dialog(4) . bezier 曲面a.编写各函数,如图:uoid cheyjieherniteuiew:getmaxx。"获得屏幕宽度<crect rect;getclientrect(rrect);maxx=rect.right;>uoid cheyjieherniteuiew:getmaxv()获得屏幕高度<crect rect;getclientrect(rrect): maxv-rect.bottom;>uoid cheyjieherniteuiew:readpoint(
34、)/i入控制多边形 16个顶点坐标 <p3doo.x-2o0;p3doo.y-2o;p3doo.z-o;/poop3d01.x=15o;p3d01 y=0;p3d0h zt00;/p01p3d02.x=50;p3d02.y=-130;p3d02.z=100;/p02uoid cheyjieherniteuiew: :transforn3dto2d()/三维坐标变换为二维坐标 <for(int i=0;i<4;i*)for(int j=0;j<4;j*)<p2dij.x=p3dij.y-p3dij.x/sqrt(2);uoid cheyjieherniteuiew:
35、line(cpoint p)/lsj线<cclientdc dc(this);cpen mypen,*p01dpen;mypen.createpen(ps_solid,2,rgb(0,150,o);p01dpen=dc.select0biect(&mupen):uoid cheyjieherniteuiew:drawctrp!从左到右绘制控制多边形<cpoint p4;for(int i=0;i<4;i*+)<fnr(i nt i = r: i<l*:uoid cheyjiehermiteuiew:drawctrp2()/从前到后绘制扌空制多边形 <
36、cpoint p4;for(int j=0;j<4;j+)uoid cheyjiehermiteuiew:signctrpoint()/标注控制点的编号< cclientdc dc(this); cstring str; dc.setbkmode(transparent); for(int i=0;i<4;i+)uoid cheyjieherniteuiew:drawbezierface()/绘制双3次bezier 曲面< 一cclientdc dc(this);double x9y9u9u,u19u29u39u4,u19u29u3,u4;dmihip mrairm:u
37、oid cheyjieherniteuiew:calculatel(double m04 ,p3d p04)/两个矩阵相乘< kppnari ni da!mafrri xfpfit、二uoid cheyjiehermiteuiew:calculate2(p3d p0 4 ,double m14)/个矩阵p刈l相乘 <keeporiginalmatrix(p0,t);for(int i=0;i<4;i*)uoid cheyjieherniteuiew:keep0riginalmatrix(p3d 0rig44 ,p3d dest44)/保留矩阵函数 <for(int i=
38、0;i<4;i*)for(int j«0;j<4;j*)uoid cheyjieherniteuiew:matrixrotate(double 4)矢巨阵转萱 <for(int i=0;i<4;i+)b.添加p2d和p3d类,如图:添加变量如图:卜“ss p2d<public: p2d(); uirtual p2d(); double x; double y;:lass p3d3ublic:p3d();virtual p3d(); louble x;double y; double z;>itendif / ?defined(af可看到,如图:趣|
39、2gi0 x阳略|陌両宙|函q文件编辑查看® 插入工程电)组建工具cd窗口帮r)p2d (all class members -p2d3上 曰嗣 heyjiehermite classes 由七 caboutdig 申“r cheyjiehermiteapp 申 f cheyjiehermitedoc 田 f cheyjiehermiteview 由弋 cmainframe p2d0 op2d0 0 x oy日 r p3d p3d0 *p3d0 0xq 2b- o globals/ p2d.h: interface f / ttif ?defined(afx_p2d_ ttdefin
40、e afx_p2d_h_8e ttif _msc_uer > 1000 ttpragma once ttendif / _msc_uer > class p2d< public:p2d(); uirtual p2d(); double x;double y;ttendif / ?defined(af5对菜单进行设置。其结果如图:heyjiehermite - microsoft visual c+ heyjiehermite.rc - id©|陌固宙|駛jm.程(e)组建谢工具cd囱口帮助砂members ! q line< 怜窗盖! 01也:文件(d编辑查看
41、帮助曲线曲面的绘制厂hermite绘制控制多边形bezih曲浅崔制hernrteff条曲线绘制三次b样条曲线berizaheyjiehermite - microsoft visual c+ -heyjiehermite.rc idr> |恒|固宙刑jjp)组建®)工具cd窗口帮助mbers | line吃參窗西! el也文件 編辑査看(y)帮助(b)曲钱曲面的绘制 匚二hermiteboer曲线绘制二wo*復柏姐其id如下:菜单项目屋性x虫窘常规i扩展样式iid: id_menudraw三|标明q: |绘制控制多边形厂分隔符回厂弹岀(qj厂非活动 中断回:庇zj厂己复选凶厂己
42、变灰(£)厂帮助(u提示 |uoid cheyjiehermiteuiew:onmehudrau()/ todo: add your command handler code hg“byangt=false;berizaface=false; hermit=true; inualidate();菜单项目屋性x申常规i扩展样式iid: |ld_menudrawhermite 三标明(£: |hermite样条曲线绘制厂分隔符回厂弹出© 厂非活动 中断回:3厂己复选凶 厂己变灰 厂帮助0j 提示 |uoid chepjieherniteuiew: :onmenudra
43、whernite() /菜单函数/ todo: add your command handmr code tw"cclientdc dc(this);afxgetmainwnd( )->setwindowtext(i,三次hermite样条曲线何永洁"); hernite(&de);uoid cheyjieherniteuieu:onmenubeziercurue() todo: add your command handler code harebyangtfalse;hermit=false;berizaface=false;inualidate();re
44、drauwindowo;afxgetmainwnd( )->setwindovitext("bezier曲线何永洁");/显示标题nessagebox(-单击左犍绘制控制多边形,单击右61绘制曲线提示mb.ok); pt=new cpointn_max_point;flag=true;ctrlpoint=0;菜单项目屋性x卡纪常规i扩展样式iid: fldlmenub3标明q: |三次b样条曲线厂分隔符回 厂弹岀© 厂非活动中断回:庄3厂己复选凶 厂己变灰厨 厂帮助0j提示 |/ todo: add your connand handler code he"uoi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兰州财经大学《土木工程制图》2023-2024学年第二学期期末试卷
- 兰州理工大学《工程测量B理论》2023-2024学年第二学期期末试卷
- 绍兴文理学院《项目导向专业课程量子信息方向》2023-2024学年第二学期期末试卷
- 厦门演艺职业学院《古生物学与地史学》2023-2024学年第二学期期末试卷
- 武汉工程大学《数学建模综合实践》2023-2024学年第二学期期末试卷
- 辽宁石油化工大学《曲式与作品分析Ⅱ》2023-2024学年第一学期期末试卷
- 家政公司服务保姆合同
- 住宅小区手房买卖合同
- 劳务外包技术服务合同
- 房产抵押经营贷款合同
- 儿童太阳系知识科普课件
- 2024-2025学年七年级下册历史 第10课《金与南宋的对峙》教学设计
- MRI基础知识教学课件
- 染发全部知识培训课件
- 2022-2027年中国无锡市养老地产行业发展监测及发展战略规划报告
- 三年级下册美术教案
- 档案管理实务基础试题及答案
- 2025空压机节能升级合同能源管理(EMC)项目合同
- 上海杨浦区社区工作者考试真题2024
- 2024年全国中学生生物学联赛试题含答案
- GLB-2防孤岛保护装置试验报告
评论
0/150
提交评论