收藏 分享(赏)

计算机图形学实验--完整版-带结果--vc++实现.doc

上传人:weiwoduzun 文档编号:3612063 上传时间:2018-11-13 格式:DOC 页数:22 大小:421KB
下载 相关 举报
计算机图形学实验--完整版-带结果--vc++实现.doc_第1页
第1页 / 共22页
计算机图形学实验--完整版-带结果--vc++实现.doc_第2页
第2页 / 共22页
计算机图形学实验--完整版-带结果--vc++实现.doc_第3页
第3页 / 共22页
计算机图形学实验--完整版-带结果--vc++实现.doc_第4页
第4页 / 共22页
计算机图形学实验--完整版-带结果--vc++实现.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、计算机图形学实验报告信息学院计算机专业 20081060183 周建明综括:利用计算机编程语言绘制图形,主要实现以下内容:(1) 、中点算法生成任意斜率直线,并设置线型线宽。(2) 、中点算法生成圆(3) 、中点算法生成椭圆(4) 、扫描算法实现任意多边形填充(5) 、Cohen_Sutherland 裁剪(6) 、自由曲线与曲面的绘制(7) 、二维图形变换(8) 、三视图变换实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者 Bresenham 画线法任选一) ,只要求实现在第一象限内的直线。二、算法原理介绍双击直线生成.dsw 打开给定的程

2、序,或者先启动 VC+,文件(file )打开工作空间(open workspace) 。打开 直线生成 view.cpp,按注释改写下列函数:1. void CMyView:OnDdaline() (此为 DDA 生成直线)2. void CMyView:OnBresenhamline()(此为 Bresenham 画直线)3. void CMYView:OnMidPointLine()(此为中点画线法)三、程序源代码1. DDA 生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx; x=xa;y=ya

3、;if(abs(k)SetPixel(x, int(y+0.5),COLOR);y=y+k;if(abs(k)=1)for(y=ya;ySetPixel(int(x+0.5),y,COLOR);x=x+1/k;/DDA 画直线结束2. Bresenham 画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k0yi=ya;xa+;ya=ya+0.5;if(dSetPixel(xi,yi,COLOR);/BresenHam 画直线结束3. 中点画线法源程序:float b,d,xi,y

4、i;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k0yi=ya;xa+;ya=ya+0.5;if(dSetPixel(xi,yi,COLOR);/BresenHam 画直线结束四、实验结果1、DDA 生成直线2、Bresenham 画直线3、中点画线法实验二、bresenham 画圆一、实验内容根据提供的程序框架,修改部分代码,用 Bresenham 画法画一段圆弧或者画圆。二、算法原理介绍双击 experiment.dsw 打开,或者先启动 VC+,文件(file)打开工作空间(open workspace) 。打开

5、直线生成 view.cpp,按注释改写下列函数:void CMyView:OnBresenhamCircle()三、程序源代码bresenham 画圆源程序void Bresenhan_circle();int x,y=180,color=1,xcenter,ycenter;x=0;int d=3-2*180;while(xSetPixel(0+x,0+y,COLOR);pdc-SetPixel(0+x,0-y,COLOR);pdc-SetPixel(0-x,0+y,COLOR);pdc-SetPixel(0-x,0-y,COLOR);pdc-SetPixel(0+y,0+x,COLOR);p

6、dc-SetPixel(0+y,0-x,COLOR);pdc-SetPixel(0-y,0+x,COLOR);pdc-SetPixel(0-y,0-x,COLOR); 四、实验结果实验三、二维图形的几何变换一、实验内容以一条直线段为例,完成目标的平移、绕任一点旋转。 (缩放等其它变换选做)二、实验步骤和方法1、打开二维变换.dsw2、改写二维变换 view.cpp 里的 void CMyView:Onrecycle()函数(需要改写的地方我已经做了说明) 。3、生成直线的函数采用 VC 里的函数。4、函数的主要任务是计算出变换后的坐标。三、程序源代码1. 目标的平移的源程序xa1=xa+dx;

7、ya1=ya+dy;xb1=xb+dx;yb1=yb+dy;2. 绕任意点旋转的源程序xa1=cos(angle/57.1)*xa-sin(angle/57.1)*ya+x-x*cos(angle/57.1)+y*sin(angle/57.1);ya1=sin(angle/57.1)*xa+cos(angle/57.1)*ya+y-y*cos(angle/57.1)-x*sin(angle/57.1);xb1=cos(angle/57.1)*xb-sin(angle/57.1)*yb+x-x*cos(angle/57.1)+y*sin(angle/57.1);yb1=sin(angle/57.

8、1)*xb+cos(angle/57.1)*yb+y-y*cos(angle/57.1)-x*sin(angle/57.1);四、实验结果1、目标的平移的源程序2、绕任意点旋转的源程序实验四、用扫描线算法实现多边形填充:(1)算法思想:用水平扫描线从上到下扫描由点线段构成的多段定义的多边形。每根扫描线与多边形各边产生一系列交点,将这些交点按照 x 坐标进行排序,将排序后的交点成对取出,作为两个端点,用所需填充的色彩画水平直线。多边形被扫描完毕,则填充结束。实现步骤:(1) 建立边的分类表 ET;(2) 将扫描线纵坐标 y 的初值为 ET 中非空元素的最小序号;(3) 置活化边表 AEL 为空;

9、(4) 执行下列步骤直至 ET 和 AEL 都为空;A、 如果 ET 中的第 y 类非空,则将其中的所有边取出并插入 AEL 中,在插入过程忠进行排序;B、 对 AEL 中的边两两配对,将每对边中 x 坐标按规则取整,获得有效的填充区段,再填充;C、 将当前扫描线纵坐标 y 值递增 1,即 y=1;D、 将 AEL 中满足 y=ymax 边删去;E、 对 AEL 中剩下的每一条边的 x 递增 deltax,即 x=x+deltax;(2)程序实现typedef struct int y_top; float x_int; int delta_y; float x_change_per_scan

10、; EACH_ENTRY; EACH_ENTRY sidesMAX_POINT; int xMAX_POINT,yMAX_POINT; int side_count,first_s,last_s,scan,bottomscan,x_int_count; void fill_area(int count) sort_on_bigger_y(count); first_s=1; last_s=1; for(scan=sides1.y_top;scan=bottomscan;scan-) update_first_and_last(count,scan); process_x_intersectio

11、ns(first_s,last_s); draw_lines(scan,x_int_count,first_s); update_sides_list(); sort_on_bigger_y(int n) int k,x1,y1;int tem; side_count=0; y1=yn; x1=xn; bottomscan=yn; for(k=1;ky1) x2_temp+=x_change_temp; maxy=(y1y2)? y1:y2; while(entry1) entry-; sidesentry.y_top=maxy; sidesentry.delta_y=abs(y2-y1)+1

12、; if(y1y2) sidesentry.x_int=x1; else sidesentry.x_int=x2_temp; sidesentry.x_change_per_scan=x_change_temp; update_first_and_last(int count,int scan) while(sideslast_s+1.y_top=scan) sort_on_x(k,first_s); sort_on_x(int entry,int first_s) while(entryfirst_s)x-y_top=y-y_top;y-y_top=i_temp; f_temp=x-x_in

13、t;x-x_int=y-x_int;y-x_int=f_temp; i_temp=x-delta_y;x-delta_y=y-delta_y;y-delta_y=i_temp; f_temp=x-x_change_per_scan;x-x_change_per_scan=y-x_change_per_scan; y-x_change_per_scan=f_temp; draw_lines(int scan,int x_int_count,int index) int k,x,x1,x2; for(k=1;k0) sidesk.delta_y-; sidesk.x_int-=sidesk.x_c

14、hange_per_scan; 实验五用 Cohen-Sutherland 裁剪算法实现直线段裁剪:5.1 编码算法:5.1.1 算法思想:本算法分为三个步骤:判断线段两端是否都在窗口内,如果是,线段完全可见;否则判断线段是否显然不可见,如果是,裁剪结束。否则求线段与窗口边延长线的交点,此线段将线段分为两段,其中一段不可见,舍弃。对余下的线段继续进行递归裁剪。算法的编码是进行二进制位运算,若顶点在窗口内,则二进制编码为 0000;否则进行编码。5.1.2 实现步骤:(1)这种算法利用编码的方法,延长窗口边线,使得它们把包含未经裁剪图形的窗口平面区域分成九个区域:(2)每个区域用一个 4 位编码

15、 CtCbCrCl 来表示,代码中每一位分别是 0 或 1,是按照窗口边线来确定的,下面给出具体的编码规则,其中最右边的位 Cl 是第一位,依次 Cr 第二、Cb 第三、Ct 第四位。A、当两端点 P1(x1,y1)和 P2(x2,y2)在区域 0000 中,即满足点的裁剪不 等式:B、当两个端点在窗口边线外的同侧位置,则他们的四位代码中,有一相同位,同时位“1”,显然两个端点代码 C1 和 C2 按位与运算 C1 /*定义获得端点的代码函数*/int i,x11,y11; /*定义交点坐标*/int aa=1;getcode(x1,y1,a);getcode(x2,y2,b);/*1:裁剪循

16、环开始*/while(aa!=0)if(a0+a1+a2+a3=0)return;else if(a0setwritemode(0); /*设置画线的输出模式为覆盖方式*/line(x1,y1,x2,y2); /*进行裁剪 也就是进行覆盖*/aa=0;return;/*2:线段即不完全可见,也不完全不可见,即与边有交点的线段的裁剪处理*/elseif(a0+a1+a2+a3=0) /*寻找不可见点*/for(i=0;iright) d1=1;if(ybottom) d2=1;if(y#includeint a144=30,0,0,1,30,40,0,1,0,40,0,1,0,40,10,1,0

17、,30,30,1,0,0,30,1,30,0,30,1,30,10,30,1,10,10,30,1,10,30,30,1,10,40,10,1,10,10,10,1,30,10,10,1,30,40,10,1;float t44,p144;void a400()int i,j;for(i=0;i4;i+)for(j=0;j4;j+)tij=0;void a500() int k,i,j;for(i=0;i14;i+)for(j=0;j4;j+)pij=0;for(k=0;k4;k+)pij=pij+aik*tkj;pi0=pi0+280;pi1=-pi1+180;setcolor(9);mov

18、eto(p00,p01);for(i=0;i14;i+)lineto(pi0,pi1);line(p60,p61,p00,p01);line(p70,p71,p120,p121);line(p80,p81,p110,p111);line(p90,p91,p40,p41);line(p100,p101,p30,p31);line(p130,p131,p100,p101);line(p10,p11,p130,p131);getch();main()int driver,mode,i,j;driver=DETECT;initgraph(setbkcolor(3);a400();t00=0.7071*

19、3;t01=-0.4082*3;t10=-0.7071*3;t11=-0.4082*3;t21=0.8165*3;t33=1;a500();closegraph();实验总结在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。 由于本实验采用 C 语言编程,而 C 语言在图形界面的制作方面较其他面向对象语言而言没有优势,但是在实验基本的图形绘制方面,只要选择好算法并加以实施也能够实现。本实验只是完成了一部分主要的功能,而每种功能都只选用了其中一种算法,但是在完成的过程中,我也很深刻地了解和认识了各种算法,留下了印象。但是未能实现整个画图板界面还是很遗憾,我将继续努力把它完善。我需要完成的功能主要有以下几点:(1) 、汉字的编写功能(2) 、投影变换(3) 、隐藏面消隐(4) 、三维图形变换等

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报