ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:21.17KB ,
资源ID:9298542      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9298542.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学实验一.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学实验一.docx

1、计算机图形学实验一实验一 二维基本图元的生成与填充实验目的1. 了解并掌握二维基本图元的生成算法与填充算法。2. 实现直线生成的DDA算法、中点算法和Bresenham算法。3. 实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。二. 实验内容和要求1. 选择自己熟悉的任何编程语言, 建议使用VC+6.0。2. 创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。3. 实现生成直线的DDA算法、中点算法和Bresenham算法。4. 实现圆弧生成的中点算法。5. 实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。6. 实现一般连通区域的基于扫描线的种子填充算法。7

2、. 将生成算法以菜单或按钮形式集成到用户界面上。8. 直线与圆的坐标参数可以用鼠标或键盘输入。6. 可以实现任何情形的直线和圆的生成。实验报告1 用户界面的设计思想和框图。2 各种实现算法的算法思想。3 算法验证例子。4 上交源程序。直线生成程序设计的步骤如下:为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。图1-1 基本图形生成的程序运行界面2创建工程名称为“基本图形的生成”单文档应用程序框架(1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工

3、程”标签。(2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入 “基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。(3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。(4)接受默认选项,单击“下一个”按钮,在出现的Step 3Step 5对话框中,接受默认选项,单击“下一个”按钮。(5)在Step 6对话框中单击“完成”按钮,即完成“基本图形的生成”应用程序的所有选项,随后出现工程信息对话框(记录以上步骤各选项选择情况),如图1-2所示,单击“确定”按钮,完成应用程序框架的创建。图1-2 信息程序基本3编辑菜单资源设计如图1-1

4、所示的菜单项。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-1中的定义编辑菜单资源。此时VC已自动建好程序框架,如图1-2所示。表1-1 菜单资源表菜单标题菜单项标题标示符ID直线DDA算法生成直线ID_DDALINEBresenham算法生成直线ID_BRESENHAMLINE中点算法生成直线ID_MIDPOINTLINE4添加消息处理函数利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizar

5、d会自动完成有关的函数声明。表1-2 菜单项的消息处理函数菜单项ID消 息消息处理函数ID_DDALINECONMMANOnDdalineID_MIDPOINTLINECONMMANOnMidpointlineID_BRESENHAMLINECONMMANOnBresenhamline5程序结构代码,在CMyView.cpp文件中相应位置添加如下代码:/ DDA算法生成直线void CMyView: OnDdaline()CDC* pDC=GetDC();/获得设备指针int xa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0);/定义直线的两端点,直线颜色 i

6、nt x,y; float dx, dy, k; dx=(float)(xb-xa), dy=(float)(yb-ya); k=dy/dx, y=ya; if(abs(k)1) for (x=xa;xSetPixel (x,int(y+0.5),c); y=y+k; if(abs(k)=1) for (y=ya;ySetPixel (int(x+0.5),y,c); x=x+1/k; ReleaseDC(pDC);说明:(1)以上代码理论上通过定义直线的两端点,可得到任意端点之间的一直线,但由于一般屏幕坐标采用右手系坐标,屏幕上只有正的x, y值,屏幕坐标与窗口坐标之间转换知识请参考第3章。

7、(2)注意上述程序考虑到当k?1的情形x每增加1,y最多增加1;当k1时,y每增加1,x相应增加1/k。在这个算法中,y与k用浮点数表示,而且每一步都要对y进行四舍五入后取整。/中点算法生成直线void CMyView:OnMidpointline() CDC* pDC=GetDC();int xa=300, ya=200, xb=450, yb=300,c=RGB(0,255,0); float a, b, d1, d2, d, x, y; a=ya-yb, b=xb-xa, d=2*a+b; d1=2*a, d2=2* (a+b); x=xa, y=ya; pDC-SetPixel(x,

8、y, c); while (xxb) if (dSetPixel(x, y, c); ReleaseDC(pDC);说明:(1)其中d是xp, yp的线性函数。为了提高运算效率,程序中采用增量计算。具体算法如下:若当前像素处于d0情况,则取正右方像素P1(xp+1, yp),判断下一个像素点的位置,应计算d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;,其中增量为a。若d=0) s1=1; else s1=-1;if(y2-y1=0) s2=1; else s2=-1;if(deltaydeltax)temp=deltax;deltax=deltay;delt

9、ay=temp;interchange=1; else interchange=0; f=2*deltay-deltax; pDC-SetPixel(x,y,c); for(i=1;i=0) if(interchange=1) x+=s1; else y+=s2; pDC-SetPixel(x,y,c); f=f-2*deltax; else if(interchange=1) y+=s2; else x+=s1; f=f+2*deltay; 说明:(1)以上程序已经考虑到所有象限直线的生成。(2)Bresenham算法的优点如下: 不必计算直线的斜率,因此不做除法。 不用浮点数,只用整数。

10、只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。 Bresenham算法的运算速度很快。圆弧生成程序设计的步骤如下:(1)创建应用程序框架,以上面建立的单文档程序框架为基础。(2)编辑菜单资源。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-3中的定义添加编辑菜单资源。此时建好的菜单如图1-3所示。图1-3 程序主菜单表1-3 菜单资源表菜单标题菜单项标题标示符ID圆中点画圆ID_MIDPOINTCIRCLEBresenham画圆ID_BRESENHAMCIRCLE(3)添加消息处理函数。利用ClassWiza

11、rd(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-4建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。表1-4 菜单项的消息处理函数菜单项ID消 息消息处理函数ID_MIDPOINTCIRCLECONMMANOnMidpointcircleID_BRESENHAMCIRCLECONMMANOnBresenhamcircle(4)程序结构代码,在CMyView.cpp文件中的相应位置添加如下代码。void CMyView:OnMidpointcircle() /中点算法绘制圆,如图1-4所示图1-4 中点算法绘制

12、圆/ TODO: Add your command handler code hereCDC* pDC=GetDC(); int xc=300, yc=300, r=50, c=0; int x,y; float d; x=0; y=r; d=1.25-r; pDC-SetPixel (xc+x),(yc+y),c); pDC-SetPixel (xc-x),(yc+y),c); pDC-SetPixel (xc+x),(yc-y),c); pDC-SetPixel (xc-x),(yc-y),c); pDC-SetPixel (xc+y),(yc+x),c); pDC-SetPixel (x

13、c-y),(yc+x),c); pDC-SetPixel (xc+y),(yc-x),c); pDC-SetPixel (xc-y),(yc-x),c); while(x=y) if(dSetPixel (xc+x),(yc+y),c); pDC-SetPixel (xc-x),(yc+y),c); pDC-SetPixel (xc+x),(yc-y),c); pDC-SetPixel (xc-x),(yc-y),c); pDC-SetPixel (xc+y),(yc+x),c); pDC-SetPixel (xc-y),(yc+x),c); pDC-SetPixel (xc+y),(yc-x

14、),c); pDC-SetPixel (xc-y),(yc-x),c); void CMyView:OnBresenhamcircle() / Bresenham算法绘制圆,如图1-5所示CDC* pDC=GetDC();int xc=100, yc=100, radius=50, c=0;图1-5 Bresenham算法绘制圆int x=0,y=radius,p=3-2*radius;while(xSetPixel(xc+x, yc+y, c);pDC-SetPixel(xc-x, yc+y, c);pDC-SetPixel(xc+x, yc-y, c);pDC-SetPixel(xc-x,

15、 yc-y, c);pDC-SetPixel(xc+y, yc+x, c);pDC-SetPixel(xc-y, yc+x, c);pDC-SetPixel(xc+y, yc-x, c);pDC-SetPixel(xc-y, yc-x, c);if (pSetPixel(xc+x, yc+y, c);pDC-SetPixel(xc-x, yc+y, c);pDC-SetPixel(xc+x, yc-y, c);pDC-SetPixel(xc-x, yc-y, c);pDC-SetPixel(xc+y, yc+x, c);pDC-SetPixel(xc-y, yc+x, c);pDC-SetPi

16、xel(xc+y, yc-x, c);pDC-SetPixel(xc-y, yc-x, c);多边形填充程序设计的步骤如下:(1)创建应用程序框架,以上述单文档程序框架为基础,创建如图1-17所示应用程序界面。(2)编辑菜单资源。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-7中的定义添加编辑菜单资源。此时建好的菜单如图1-18所示。图1-17 程序界面表1-7 菜单资源表菜单标题菜单项标题标示符ID区域填充多边形扫描填充ID_SCANFILL种子填充ID_SEEDFILL图1-18 程序主菜单(3)添加消息处理函数。

17、利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-8建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。表1-8 菜单项的消息处理函数菜单项ID消 息消息处理函数ID_SCANFILLCONMMANOnScanfillID_SEEDFILLCONMMANOnSeedfill(4)添加程序结构代码。 在“基本图形的生成View.h”适当位置添加以下黑体字部分代码:typedef struct /建立边表结构 int num, ymin,ymax; float xmin,xmax,dx; Edg

18、e;class CMyView : public CViewprotected: / create from serialization only public:Cpoint ptset7;Edge edge7,edge17,newedge1; 在OnDraw()函数中添加如下黑体字部分代码。void CMyView:OnDraw(CDC* pDC)/绘制要填充的多边形CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPen newpen(PS_SOLID,1,RGB(255,0,0);CPen *old=pDC-SelectObject(&

19、newpen); pDC-TextOut(20,20,双击鼠标左键, 出现需填充的多边形, 点击相关功能菜单实现区域填充); pDC-TextOut(20,50,进行种子填充, 需用鼠标右键, 单击多边形内一点, 作为开始填充的种子点); pDC-SelectObject(old); 在菜单项的消息处理函数实体中添加以下黑体字部分代码。void CMyView:OnScanfill() /扫描线算法进行多边形区域填充,如图1-19所示CDC* pDC=GetDC(); CPen newpen(PS_SOLID,1,RGB(0,255,0); CPen *old=pDC-SelectObject

20、(&newpen); int j,k,s=0;图1-19 扫描线算法区域填充 int p5; /每根扫描线交点 int pmin,pmax; for(int i=0;i6;i+)/建立边表 edgei.dx=(float)(spti+1.x-spti.x)/(spti+1.y-spti.y); if(spti.y=spti+1.y) edgei.num=i; edgei.ymin=spti.y; edgei.ymax=spti+1.y; edgei.xmin=(float)spti.x; edgei.xmax=(float)spti+1.x; pmax=spti+1.y; pmin=spti.

21、y; else edgei.num=i; edgei.ymin=spti+1.y; edgei.ymax=spti.y; edgei.xmax=(float)spti.x; edgei.xmin=(float)spti+1.x; pmax=spti.y; pmin=spti+1.y; for(int r=1;r6;r+) /排序edge(yUpper,xIntersect) for(int q=0;q6-r;q+) if(edgeq.yminpmin+1;scan-) int b=0; k=s; for(j=k;jedgej.ymin)&(scan=edgej.ymax)/判断与线段相交 if

22、(scan=edgej.ymax) if(sptedgej.num+1.yedgej.ymax) b+; pb=(int)edgej.xmax; if(sptedgej.num-1.yedgej.ymin)&(scanLineTo(sptedge0.num.x,sptedge0.num.y); if(scan1) for(int u=1;uMoveTo(pu+3,scan); u+; pDC-LineTo(pu,scan); pDC-SelectObject(old); 说明:双击,出现需填充的多边形,单击相关功能菜单实现区域填充。void CMyView:OnSeedfill() /种子算法

23、进行多边形区域填充,如图1-20所示CWindowDC dc (this); int fill=RGB(0,255,0);图1-20 种子算法区域填充 int boundary=RGB(255,0,0); CPoint pt=s_point; int x,y,p0,pmin,pmax; /求多边形的最大最小值 for(int m=1;m7;m+) for(int n=0;n7-m;n+) if(sptn.ysptn+1.y) p0=sptn.y; sptn=sptn+1; sptn+1=p0; pmax=spt0.y,pmin=spt6.y; x=s_point.x; y=s_point.y; for(;ypmin-2;y-) int current=dc.GetPixel(x,y);while(current!=boundary)&(current!=fill) dc.SetPixel(x,y,fill); x+; current=dc.GetPixel(x,y);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1