计算机图形学实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一二维基本图元的生成与填充
实验目的
1.了解并掌握二维基本图元的生成算法与填充算法。
2.实现直线生成的DDA算法、中点算法和Bresenham算法。
3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。
二.实验内容和要求
1.选择自己熟悉的任何编程语言, 建议使用VC++。
2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。
3.实现生成直线的DDA算法、中点算法和Bresenham算法。
4.实现圆弧生成的中点算法。
5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。
6.实现一般连通区域的基于扫描线的种子填充算法。
7.将生成算法以菜单或按钮形式集成到用户界面上。
8.直线与圆的坐标参数可以用鼠标或键盘输入。
6. 可以实现任何情形的直线和圆的生成。
实验报告
1.用户界面的设计思想和框图。
2.各种实现算法的算法思想。
3.算法验证例子。
4.上交源程序。
直线生成程序设计的步骤如下:
为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。
图1-1 基本图形生成的程序运行界面
2.创建工程名称为“基本图形的生成”单文档应用程序框架
(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。
(2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。
(3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。
(4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。
(5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。
图1-2 信息程序基本
3.编辑菜单资源
设计如图1-1所示的菜单项。在工作区的ResourceView 标签中,单击Menu 项左边“+”,然后双击其子项IDR_MAINFRAME ,并根据表1-1中的定义编辑菜单资源。此时VC 已自动建好程序框架,如图1-2所示。
表1-1 菜单资源表
4.添加消息处理函数
利用ClassWizard
(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName 栏中选择CMyView ,根据表1-2建立如下的消息映射函数,ClassWizard 会自动完成有关的函数声明。
表1-2 菜单项的消息处理函数
5.程序结构代码,在文件中相应位置添加如下代码:
图1-3 程序主菜单
图1-5 Bresenham算法绘制圆
图1-4 中点算法绘制圆
图1-19 扫描线算法区域填充
x=(float)(spt[i+1].x-spt[i].
x)/(spt[i+1].y-spt[i].y);
if(spt[i].y<=spt[i+1].y){
edge[i].num=i;
edge[i].ymin=spt[i].y;
edge[i].ymax=spt[i+1].y;
edge[i].xmin=(float)spt[i].x;
edge[i].xmax=(float)spt[i+1].x;
pmax=spt[i+1].y;
pmin=spt[i].y;
}
else{
edge[i].num=i;
edge[i].ymin=spt[i+1].y;
edge[i].ymax=spt[i].y;
edge[i].xmax=(float)spt[i].x;
edge[i].xmin=(float)spt[i+1].x;
pmax=spt[i].y;
pmin=spt[i+1].y;
}
}
for(int r=1;r<6;r++) min { newedge[0]=edge[q]; edge[q]=edge[q+1]; edge[q+1]=newedge[0]; } } } for(int scan=pmax-1;scan>pmin+1;scan--) { int b=0; k=s; for(j=k;j<6;j++) { if((scan>edge[j].ymin)&&(scan<=edge[j].ymax))max) { if(spt[edge[j].num+1].y { b++; p[b]=(int)edge[j].xmax; } if(spt[edge[j].num-1].y { b++; p[b]=(int)edge[j].xmax; } } if((scan>edge[j].ymin)&&(scan { b++; p[b]=(int)(edge[j].xmax+edge[j].dx*(scan-edge[j]. ymax)); } } um].x,spt[edge[0].num].y); 图1-20 种子算法区域填充if(scan<=edge[j].ymin) { p0=spt[n].y; spt[n]=spt[n+1]; spt[n+1]=p0; } } } pmax=spt[0].y,pmin=spt[6].y; x=; y=; for(;y { int current=(x,y); while((current!=boundary)&&(current!=fill)) { (x,y,fill); x++; current=(x,y); } x=; x--; current=(x,y);