图形学课设报告_第1页
图形学课设报告_第2页
图形学课设报告_第3页
图形学课设报告_第4页
图形学课设报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉工业学院《计算机图形学》课程设计题目:绘制三次Bezier曲线,三次B样条曲线和Cantor图指导老师:刘文涛姓名:庞璐学号:070505129院〔系〕:计算机与信息工程系专业:软件工程完成日期:2023年1月4日一.课题题目介绍设计任务9:1〕给定下列图所示的四个控制点:P0=(228,456〕,P1=(294,247〕,P2=(452,123〕,P3=(705,197〕。分别绘制三次Bezier曲线和三次B样条曲线。2〕使用VC编程,在窗口中一次绘制n=0~5的所有Cantor图。二.整体功能及设计1〕主模块:Bezier,B样条,cantor集算法的实现。2〕响应模块:a.Bezier,B样条,cantor集的鼠标响应;b.Bezier,B样条,cantor集的菜单和提示对话框响应。c.Bezier,B样条,cantor集的快捷按钮响应。3〕附加功能模块:曲线颜色的选择。绘图绘图主模块响应模块附加功能模块算法描述:Bezier曲线功能描述:点击相应菜单,弹出提示对话框,继而可以实现鼠标取点,绘出Bezier曲线和B样条曲线;选择cantor集菜单在弹出的对话框中输入n的值,随即绘出cantor集图形。三.编程实现1.属性和方法的定义:classCMy070505129View:publicCView{protected://createfromserializationonly CMy070505129View(); DECLARE_DYNCREATE(CMy070505129View)//Attributesboolmousestate;//鼠标状态标志 CPointcp[4];//顶点 inti;//控制多边形顶点 intm;//判断函数 intMaxX,MaxY;//屏幕x和y的最大坐标 intn;//递归深度COLORREFccolor;//设置颜色值public: CMy070505129Doc*GetDocument();//Operations voidDrawBezier();//Bezier函数 voidDrawByangtiao();//B样条函数voidCantor(double,double,double,double,int);//cantor函数2.头文件:#include"stdafx.h"#include"070505129.h"#include"070505129Doc.h"#include"070505129View.h"#include"Bezier.h"#include"Byangtiao.h"#include"Cantor.h"#defineROUND(x)int(x+0.5)//四舍五入3.方法实现:CMy070505129View::CMy070505129View(){//局部数据初始化 mousestate=false; i=0; cp[0].x=0; cp[0].y=0; cp[1].x=0; cp[1].y=0; cp[2].x=0; cp[2].y=0; cp[3].x=0; cp[3].y=0;}voidCMy070505129View::DrawBezier()//Bezier函数{ CClientDCdc(this);//设备上下文 doublet=0.0;//Bezier算法实现 while(t<1.0) { doubleptx=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].x+(3*t*t*t-6*t*t+3*t)*(double)cp[1].x+((-(3*t*t*t))+3*t*t)*(double)cp[2].x+t*t*t*(double)cp[3].x;doublepty=((-(t*t*t))+3*t*t-3*t+1)*(double)cp[0].y+(3*t*t*t-6*t*t+3*t)*(double)cp[1].y+((-(3*t*t*t))+3*t*t)*(double)cp[2].y+t*t*t*(double)cp[3].y;dc.SetPixel((int)(ptx+0.5),(int)(pty+0.5),ccolor);//ccolor为颜色变量 t+=1/10000.0;//步长 }}voidCMy070505129View::DrawByangtiao()//B样条函数{ CClientDCdc(this);//设备上下文 doublet=0.0,x,y;//局部变量t为步长,x,y为每次曲线相应的点 dc.MoveTo(cp[0]);//绘制四个控制点组成的四条线for(inti=1;i<4;i++){ dc.LineTo(cp[i]);}//B样条算法实现 while(t<1.0){ doubleF0=(-(t*t*t)+3*t*t-3*t+1)/6.0;doubleF1=(3*t*t*t-6*t*t+4)/6.0;doubleF2=(-3*(t*t*t)+3*t*t+3*t+1)/6.0;doubleF3=t*t*t/6.0; x=cp[0].x*F0+cp[1].x*F1+cp[2].x*F2+cp[3].x*F3; y=cp[0].y*F0+cp[1].y*F1+cp[2].y*F2+cp[3].y*F3; dc.SetPixel((int)(x+0.5),(int)(y+0.5),ccolor);//ccolor为颜色变量 t+=1/1000.0;//步长 }}voidCMy070505129View::Cantor(doubleax,doubleay,doublebx,doubleby,intx)//cantor函数{doublecx,dx,cy,dy;//cantor中间点座标 CClientDCdc(this);//设备上下文 if(x==0){ dc.MoveTo(ROUND(ax),ROUND(ay+MaxY/2)); dc.LineTo(ROUND(bx),ROUND(by+MaxY/2)); return; } //递归 cx=ax+(bx-ax)/3;cy=ay;Cantor(ax,ay,cx,cy,x-1);dx=ax+2*(bx-ax)/3;dy=by;Cantor(dx,dy,bx,by,x-1);}voidCMy070505129View::OnBezier()//菜单响应函数{ //TODO:Addyourcommandhandlercodehere mousestate=true;//重新设制鼠标状态 CBezierbezier;//定义对话框类对象 bezier.DoModal();//响应 m=1;//标记值,双击时调用相应的函数 Invalidate();}voidCMy070505129View::OnByangtiao()//菜单响应函数{ //TODO:Addyourcommandhandlercodehere mousestate=true;//重新设制鼠标状态 CByangtiaoByangtiao;//定义对话框类对象 Byangtiao.DoModal();//响应 m=2;//标记值,双击时调用相应的函数 Invalidate();}voidCMy070505129View::OnLButtonDown(UINTnFlags,CPointpoint)//单击获取控制点函数{ if(mousestate) { //获取x坐标 cp[i].x=point.x;//获取y坐标 cp[i].y=point.y; //存四个控制点放入cp[4] if(i<4) i++; else mousestate=false; } CView::OnLButtonDown(nFlags,point);}voidCMy070505129View::OnBUTTONBezier()//Bezier快捷按钮函数{//重新绘制 Invalidate();//重新设制鼠标状态 mousestate=true;//标记值,双击时调用相应的函数 m=1;}voidCMy070505129View::OnBUTTONByangtiao()//B样条快捷按钮函数{ //TODO:Addyourcommandhandlercodehere Invalidate();//重新绘制 mousestate=true;//重新设制鼠标状态 m=2;//标记值,双击时调用相应的函数}voidCMy070505129View::OnLButtonDblClk(UINTnFlags,CPointpoint)//双击{ //TODO:Addyourmessagehandlercodehereand/orcalldefault //鼠标状态 mousestate=false;//调用画Bezier函数 if(m==1) DrawBezier(); //调用画B样条函数 if(m==2) DrawByangtiao(); CView::OnLButtonDblClk(nFlags,point);}voidCMy070505129View::Oncantor()//Cantor集菜单响应函数{ //TODO:Addyourcommandhandlercodehere //定义对话框类对象 CCantorcantor; //设备上下文 CClientDCdc(this); //响应 cantor.DoModal();n=cantor.m_n; //立即重绘屏幕 RedrawWindow(); //获取屏幕最大x,y值 CRectRect; GetClientRect(&Rect);MaxX=Rect.right; MaxY=Rect.bottom; //调用Cantor算法实现函数 Cantor(0,0,MaxX,0,n);}voidCMy070505129View::OnMENUITEMcolor()//颜色菜单响应函数{ //TODO:Addyourcommandhandlercodehere //定义对颜色对话框类对象 CColorDialogcolor;color.m_cc.rgbResult=ccolor; color.DoModal(); //得到用户选择的颜色 ccolor=color.GetColor();}四.使用说明点击相应菜单,弹出提示对话框,单击〞ok〞键,使用鼠标单击四下取点,双击绘出Bezier曲线或B样条曲线;或者单击选择单击图形按钮随即单击鼠标四下,双击绘出Bezier曲线或B样条曲线。选择cantor集菜单在弹出的对话框中输入n的值,单击〞ok〞键,随即绘出cantor集图形。五.结果分析选择Bezier曲线菜单:选择ok:单击四下双击:点击:选择B样条曲线菜单:选择ok:单击四下双击以下:点击:选择Cantor集菜单:在对话框中输入n值:n=0n=1n=2n=3n=4n=5六.课程设计总结通过本次课设,进一步对图形学局部算法进行实现,掌握了其根本思想,原理,实现步骤。还了解掌握了其他相关知识,对MFC控件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论