计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制

上传人:go****e 文档编号:137287735 上传时间:2020-07-07 格式:DOC 页数:9 大小:320KB
返回 下载 相关 举报
计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制_第1页
第1页 / 共9页
计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制_第2页
第2页 / 共9页
计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制_第3页
第3页 / 共9页
计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制_第4页
第4页 / 共9页
计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制》由会员分享,可在线阅读,更多相关《计算机图形学实验4-----Hermite-Bezier-B样条三种曲线的绘制(9页珍藏版)》请在金锄头文库上搜索。

1、实验四 Hermite Bezier 样条三种曲线的绘制1、 实验目的 了解和学习Hermite、Bezier、样条三种曲线算法 掌握基于 Win32、Visual C+环境MFC绘制图形配置过程制过程 编程实现Hermite、Bezier、样条三种曲线的绘制2、 实验原理 三次参数曲线1. 曲线段可以用端点、切向量和曲线段之间的连续性等约束条件来定义 2. 两个端点和两端点处的切向量定义Hermite曲线; 3. 两个端点和另外两个控制端点切向量的点定义的Bezier曲线;4. 由四个控制顶点定义的样条曲线。3、 实验关键代码void CDrawYTQXView:Hermite()/绘制He

2、rmite三次插值样条int a44 =2,-2,1,1,-3,3,-2,-1,0,0,1,0,1,0,0,0;/Mh矩阵系数int b42;/边界点 for(int i=0;i4;i+)b00=p1i0;b01=p1i1;/起点的坐标b10=p1i+10;b11=p1i+11;/终点的坐标b20=p2i0;b21=p2i1;/起点的导数b30=p2i+10;b31=p2i+11;/终点的导数Caculate(a,b);CClientDC dc(this);CPen MyPen,*pOldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255);pOldPen=d

3、c.SelectObject(&MyPen);dc.MoveTo(p1i0,p1i1);for(double t=0.0;t=1;t+=1.0/400)int x=ROUND(pow(t,3)*result00+pow(t,2)*result10+ t*result20+result30);int y=ROUND(pow(t,3)*result01+pow(t,2)*result11+ t*result21+result31);dc.LineTo(x,y);dc.SelectObject(pOldPen);MyPen.DeleteObject();void CDrawYTQXView:Cacu

4、late(int a44,int b42)/矩阵相乘int i,j,k;for(i=0;i4;i+)for(j=0;j2;j+)resultij=0;/矩阵清零for(i=0;i2;i+)for(j=0;j4;j+)for(k=0;k4;k+)resultji+=ajk*bki; void CDrawYTQXView:DrawBezier()/绘制Bezier曲线CClientDC dc(this);double x,y;int rate=400,n;n=CtrlPoint-1;for(double t=0;t=1;t+=1.0/rate)x=0;y=0;for(int i=0;i=n;i+)

5、x+=pti.x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);y+=pti.y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);dc.SetPixel(ROUND(x),ROUND(y),RGB(0,0,255);/曲线颜色double CDrawYTQXView:Cnk(const int &n, const int &i)/Bernstein第一项return double(Factorial(n)/(Factorial(i)*Factorial(n-i);int CDrawYTQXView:Factorial(int m)/阶乘函数int f=1;for(

6、int i=1;i=m;i+)f*=i;return f;void CDrawYTQXView:DrawB3_curves()/绘制B样条曲线CClientDC dc(this);int i,rate=10,m;long lx,ly;m=CtrlPoint-(3+1);double F03,F13,F23,F33;lx=ROUND(pt0.x+4.0*pt1.x+pt2.x)/6.0);/t0的起点x坐标ly=ROUND(pt0.y+4.0*pt1.y+pt2.y)/6.0);/t0的起点y坐标dc.MoveTo(lx,ly);CPen MyPen2,*pOldPen2;MyPen2.Crea

7、tePen(PS_SOLID,2,RGB(0,0,255);/颜色设置pOldPen2=dc.SelectObject(&MyPen2);for(i=1;im+2;i+)/m+1段三次样条曲线for(double t=0;t=1;t+=1.0/rate)F03=(-t*t*t+3*t*t-3*t+1)/6;/计算F0,3(t)F13=(3*t*t*t-6*t*t+4)/6;/计算F1,3(t)F23=(-3*t*t*t+3*t*t+3*t+1)/6;/计算F2,3(t)F33=t*t*t/6;/计算B3,3(t)lx=ROUND(pti-1.x*F03+pti.x*F13+pti+1.x*F2

8、3+pti+2.x*F33);ly=ROUND(pti-1.y*F03+pti.y*F13+pti+1.y*F23+pti+2.y*F33);dc.LineTo(lx,ly);dc.SelectObject(pOldPen2);MyPen2.DeleteObject();void CDrawYTQXView:DrawCharPolygon()/绘制控制多边形CClientDC dc(this);CPen MyPen,*pOldPen;MyPen.CreatePen(PS_SOLID,2,RGB(0,0,0);/控制多边形pOldPen=dc.SelectObject(&MyPen);for(i

9、nt i=0;iCtrlPoint;i+)if(i=0)dc.MoveTo(pti);dc.Ellipse(pti.x-2,pti.y-2,pti.x+2,pti.y+2);elsedc.LineTo(pti);dc.Ellipse(pti.x-2,pti.y-2,pti.x+2,pti.y+2);dc.SelectObject(pOldPen);MyPen.DeleteObject();void CDrawYTQXView:OnLButtonDown(UINT nFlags, CPoint point)/获得屏幕控制点坐标 / TODO: Add your message handler c

10、ode here and/or call defaultCView:OnLButtonDown(nFlags, point);if(Flag)ptCtrlPoint.x=point.x;ptCtrlPoint.y=point.y;if(CtrlPointN_MAX_POINT)CtrlPoint+;elseFlag=false;DrawCharPolygon();else DrawCharPolygon1();void CDrawYTQXView:OnRButtonDown(UINT nFlags, CPoint point)/调用绘制函数 / TODO: Add your message h

11、andler code here and/or call defaultFlag=false;if(Sign=0)Hermite();if(Sign=1)DrawBezier();if(Sign=2)DrawB3_curves();CView:OnRButtonDown(nFlags, point);4、 实验结果1、 绘制Hermite曲线2、 绘制Bezier曲线3. 绘制B样条曲线5、 心得体会通过实验进一步学习和了解MFC的菜单的实现及其响应函数的实现,并设置鼠标的左键激活绘制多边形,右键激活绘制Hermite、Bezier、B样条三种曲线。掌握了三个齐次坐标矩阵以及它们各自点的平移,旋转,缩放,错切变换的坐标矩阵。再做实验的同时又很好的复习了考试的内容,一举两得!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 幼儿/小学教育 > 其它小学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号