图形学课设报告
更新时间:2024-07-10 02:22:01 阅读量: 综合文库 文档下载
- 图形学毕设推荐度:
- 相关推荐
题目:
武汉工业学院
《计算机图形学》课程设计
绘制三次Bezier曲线,三次B样条曲线和Cantor图
指导老师:刘文涛 姓 名:庞璐 学 号:070505129
院 (系):计算机与信息工程系
专 业:软件工程
完成日期: 2010年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.属性和方法的定义:
class CMy070505129View : public CView {
protected: // create from serialization only CMy070505129View();
DECLARE_DYNCREATE(CMy070505129View)
// Attributes
bool mousestate;//鼠标状态标志 CPoint cp[4];//顶点 int i;//控制多边形顶点 int m;//判断函数
int MaxX,MaxY;//屏幕x和y的最大坐标 int n;//递归深度
COLORREF ccolor;//设置颜色值 public:
CMy070505129Doc* GetDocument();
// Operations
void DrawBezier();//Bezier函数 void DrawByangtiao();//B样条函数
void Cantor(double,double,double,double,int);//cantor函数
2.头文件:
#include \
#include \
#include \#include \#include \#include \#include \
#define ROUND(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; }
void CMy070505129View::DrawBezier()//Bezier函数 {
CClientDC dc(this);//设备上下文 double t=0.0;
//Bezier算法实现 while(t<1.0) { double
ptx=((-(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; double
pty=((-(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;//步长 } }
void CMy070505129View::DrawByangtiao()//B样条函数 {
CClientDC dc(this);//设备上下文
double t=0.0,x,y;//局部变量t为步长,x,y为每次曲线相应的点 dc.MoveTo(cp[0]);//绘制四个控制点组成的四条线 for(int i=1;i<4;i++) {
dc.LineTo(cp[i]); }
//B样条算法实现 while(t<1.0) {
double F0=(-(t*t*t)+3*t*t-3*t+1)/6.0; double F1=(3*t*t*t-6*t*t+4)/6.0;
double F2=(-3*(t*t*t)+3*t*t+3*t+1)/6.0; double F3=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;//步长
} }
void CMy070505129View::Cantor(double ax,double ay,double bx,double by,int x)//cantor函数 {
double cx,dx,cy,dy;//cantor中间点座标 CClientDC dc(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); }
void CMy070505129View::OnBezier()//菜单响应函数 {
// TODO: Add your command handler code here mousestate=true;//重新设制鼠标状态 CBezier bezier;//定义对话框类对象 bezier.DoModal();//响应
m=1;//标记值,双击时调用相应的函数 Invalidate(); }
void CMy070505129View::OnByangtiao()//菜单响应函数 {
// TODO: Add your command handler code here mousestate=true;//重新设制鼠标状态
CByangtiao Byangtiao;//定义对话框类对象 Byangtiao.DoModal();//响应
m=2;//标记值,双击时调用相应的函数 Invalidate(); }
void CMy070505129View::OnLButtonDown(UINT nFlags, CPoint point)//单击获取控制点函数 {
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); }
void CMy070505129View::OnBUTTONBezier()//Bezier快捷按钮函数 {
//重新绘制 Invalidate();
//重新设制鼠标状态 mousestate=true;
//标记值,双击时调用相应的函数 m=1; }
void CMy070505129View::OnBUTTONByangtiao()//B样条快捷按钮函数 {
// TODO: Add your command handler code here Invalidate();//重新绘制
mousestate=true;//重新设制鼠标状态 m=2;//标记值,双击时调用相应的函数 }
void CMy070505129View::OnLButtonDblClk(UINT nFlags, CPoint point) //双击 {
// TODO: Add your message handler code here and/or call default //鼠标状态
mousestate=false; //调用画Bezier函数 if(m==1) DrawBezier(); //调用画B样条函数 if(m==2) DrawByangtiao();
CView::OnLButtonDblClk(nFlags, point); }
void CMy070505129View::Oncantor()//Cantor集菜单响应函数 {
// TODO: Add your command handler code here //定义对话框类对象 CCantor cantor; //设备上下文
CClientDC dc(this); //响应
cantor.DoModal(); n=cantor.m_n; //立即重绘屏幕 RedrawWindow();
//获取屏幕最大x,y值
CRect Rect;
GetClientRect(&Rect); MaxX=Rect.right; MaxY=Rect.bottom;
//调用Cantor算法实现函数 Cantor(0,0,MaxX,0,n); }
void CMy070505129View::OnMENUITEMcolor()//颜色菜单响应函数 {
// TODO: Add your command handler code here //定义对颜色对话框类对象 CColorDialog color;
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=0
n=1
n=2
n=3 n=4
n=5
六.课程设计总结
通过本次课设,进一步对图形学部分算法进行实现,掌握了其基本思想,原理,实现步骤。还了解掌握了其他相关知识,对MFC控件的使用加以熟悉和掌握。可以灵活运用在程序中,以实现基本功能的基础上还有附加的交互性的功能,实验室遇到一些问题,积累了很多经验,比如响应函数名字最好不要与其他函数名冲突,会编译出错。cantor()与Oncantor就冲突了,把cantor()改为Cantor(),就好了。还有自定义对话框类最好以C开头,当view类突然不见时只要将其中扩展名为opt,clw文件删除,就可以重新出现。带着一边积累经验,增加常识;一边完成设计的想法。通过请教老师,自己查阅资料克服了困难,不但完成了设计内容,还对VC++其中的部分操作更加熟练掌握。
正在阅读:
图形学课设报告07-10
海通证券-每日投资策略-10061705-16
风寓居的街道10-28
小学生日记350字大全02-21
房屋产权归属证明02-10
小学生日记大全80字02-21
2011诏安县最新科目一完整小型汽车试题10-26
陕西省情试题(汇总)课件03-22
郑州二本大学02-21
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 图形
- 报告
- 广场绿化工程监理实施细则(质控详细)
- 医学微生物学笔记(总结得真的很好)
- 第二轮复习哲学试题
- 2007年供应保障部总结
- 加强项目宣传报道工作的思考与实践
- 2019最新版本中考物理难题错题大全汇总及答案解析883584
- PADS知识问答
- 2013年妇产科科内质控小组自查分析
- 2018-2017学年度第二学期七年级下册生物科教学计划
- 《玉篇直音》初考
- 曾仕强教授情绪管理
- 1.2013年高考理综 山东卷(化学试卷)
- 第三章《数系的扩充与复数的引入》复习提纲
- 机械手PLC控制系统设计(终)
- 119消防知识竞赛题库2
- 学前音乐教育对幼儿素质培养的重要性分析
- 盐城市国有土地上房屋征收评估管理暂行办法
- 一年级习题 - 图文
- 马克思主义基本原理概论第三章:人类社会及其发展规律
- 托福满分作文范例