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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

计算机图形学实验一Word格式.docx

1、ID_DDALINEBresenham算法生成直线ID_BRESENHAMLINE中点算法生成直线ID_MIDPOINTLINE4添加消息处理函数利用ClassWizard(建立类向导)为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CMyView,根据表1-2建立如下的消息映射函数,ClassWizard会自动完成有关的函数声明。表1-2 菜单项的消息处理函数菜单项ID消 息消息处理函数CONMMANOnDdalineOnMidpointlineOnBresenhamline5程序结构代码,在CMyView.cpp文件中相应位置添加如下代码:/ DDA算法生成直线void

2、 CMyView: OnDdaline()CDC* pDC=GetDC();/获得设备指针int xa=100,ya=300,xb=300,yb=200,c=RGB(255,0,0);/定义直线的两端点,直线颜色 int 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;y1时,y每增加1,x相应增加1/k。在这个算法中,y与k用浮点数表

3、示,而且每一步都要对y进行四舍五入后取整。/中点算法生成直线OnMidpointline() 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, y, c); while (xxb) if (d0情况,则取正右方像素P1(xp+1, yp),判断下一个像素点的位置,应计算d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.

4、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;deltay=temp;interchange=1; else interchange=0; f=2*deltay-deltax;SetPixel(x,y,c); for(i=1;i=0) if(interchange=1) x+=s1; else y+=s2; f=f-2*deltax; else if(interchange=1) y+=s2; else x+=s1; f=f

5、+2*deltay;(1)以上程序已经考虑到所有象限直线的生成。(2)Bresenham算法的优点如下: 不必计算直线的斜率,因此不做除法。 不用浮点数,只用整数。 只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。 Bresenham算法的运算速度很快。圆弧生成程序设计的步骤如下:(1)创建应用程序框架,以上面建立的单文档程序框架为基础。(2)编辑菜单资源。在工作区的ResourceView标签中,单击Menu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据表1-3中的定义添加编辑菜单资源。此时建好的菜单如图1-3所示。图1-3 程序主菜单表1-3 菜单资源表圆中点画圆

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

7、: Add your command handler code here int xc=300, yc=300, r=50, c=0; float d; x=0; y=r; d=1.25-r;SetPixel (xc+x),(yc+y),c);SetPixel (xc-x),(yc+y),c);SetPixel (xc+x),(yc-y),c);SetPixel (xc-x),(yc-y),c);SetPixel (xc+y),(yc+x),c);SetPixel (xc-y),(yc+x),c);SetPixel (xc+y),(yc-x),c);SetPixel (xc-y),(yc-x)

8、,c); while(x=y) if(d0) d+=2*x+3; else d+=2*(x-y)+5; y-; x+;OnBresenhamcircle() / Bresenham算法绘制圆,如图1-5所示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);SetPixel(xc-x, yc+y, c);SetPixel(xc+x, yc-y, c);SetPixel(xc-x, yc-y, c);SetPixel(x

9、c+y, yc+x, c);SetPixel(xc-y, yc+x, c);SetPixel(xc+y, yc-x, c);SetPixel(xc-y, yc-x, c);if (pSelectObject(&newpen);TextOut(20,20,双击鼠标左键, 出现需填充的多边形, 点击相关功能菜单实现区域填充);TextOut(20,50,进行种子填充, 需用鼠标右键, 单击多边形内一点, 作为开始填充的种子点SelectObject(old); 在菜单项的消息处理函数实体中添加以下黑体字部分代码。OnScanfill() /扫描线算法进行多边形区域填充,如图1-19所示 CPen

10、newpen(PS_SOLID,1,RGB(0,255,0); CPen *old=pDC- int j,k,s=0;图1-19 扫描线算法区域填充 int p5; /每根扫描线交点 int pmin,pmax; for(int i=0;6;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)

11、spti+1.x; pmax=spti+1.y; pmin=spti.y; else 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;rr+) /排序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=ed

12、gej.ymax)/判断与线段相交 if(scan=edgej.ymax) if(sptedgej.num+1.yedgej.ymax) b+; pb=(int)edgej.xmax; if(sptedgej.num-1.yedgej.ymax) b+; pb=(int)(edgej.xmax+edgej.dx*(scan-edgej. ymax); /pDC-LineTo(sptedge0.num.x,sptedge0.num.y); if(scan for(int u=1;uMoveTo(pu+3,scan); u+;LineTo(pu,scan);双击,出现需填充的多边形,单击相关功能菜单实现区域填充。OnSeedfill() /种子算法进行多边形区域填充,如图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.ypmin-2;y-)while(current!

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

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