计算机图形学实验报告99719.docx
- 文档编号:14199208
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:15
- 大小:68.78KB
计算机图形学实验报告99719.docx
《计算机图形学实验报告99719.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告99719.docx(15页珍藏版)》请在冰点文库上搜索。
计算机图形学实验报告99719
教育科学与技术学院
2016/2017学年第一学期
实验报告
实验课程名称计算机图形学
专业教育技术学
学生学号B14150216
学生姓名姚行健
指导教师熊健、闫静杰
指导单位通信与信息工程学院
日期:
2016年10月15日
实验一:
直线的生成
一、实验目的:
1.理解直线生成的基本原理
2.编程实现Bresenham直线扫描生成算法
二、实验内容:
在理解Bresenham直线扫描生成算法的基本思想之后再具体编写C语言程序
三、实验方法及编程:
a)实现方法介绍
过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素
b)实现代码及分析
#include
#include
intmain()
{
intgdriver=DETECT,gmode,i,a[4],b[4];
floatt,x,y;
printf("inputfourpoints\n");
for(i=0;i<4;i++)
scanf("%d%d",&a[i],&b[i]);
initgraph(&gdriver,&gmode,"C:
\\TC20\\BGI");
setcolor(12);
for(i=0;i<3;i++)
line(a[i],b[i],a[i+1],b[i+1]);
for(t=0.000;t<=1.00;t+=0.001)
{
y=(1-t)*(1-t)*(1-t)*b[0]+3*(1-t)*(1-t)*t*b[1]+3*(1-t)*t*t*b[2]+t*t*t*b[3];
x=(1-t)*(1-t)*(1-t)*a[0]+3*(1-t)*(1-t)*t*a[1]+3*(1-t)*t*t*a[2]+t*t*t*a[3];
putpixel((int)(x+0.5),(int)(y+0.5),50);
}
getch();
closegraph();
return1;
}
四、实验结果及分析:
‘
实验二:
自由曲线的生成
一、实验目的:
1.掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念
2.掌握Bezier曲线的性质
3.编程实现Bezier曲线生成算法
二、实验内容:
根据所学自由曲线的拟合方法及其相关知识编写一个绘制三次Bezier曲线的程序
三、实验方法及编程:
a)实现方法介绍
运用所学的三次贝塞尔曲线生成的算法,根据对应的数据点计算出结果,并实现三段贝塞尔在屏幕上显示的功能
b)实现代码及分析
#include
voidbezier_3(intcolor,doublep[4][2])
{
doublet,t1,t2,xt,yt;
intrate=200,x,y;
setcolor(color);
moveto(p[0][0],p[0][1]);
for(t=0;t<=1;t+=1.0/rate)
{
yt=1-t;
t1=yt*yt;
t2=3*yt*t;
xt=p[0][0]*t1*yt+p[1][0]*t2*yt+p[2][0]*t2*t+p[3][0]*t*t*t;
yt=p[0][1]*yt*t1+p[1][1]*t2*yt+p[2][1]*t2*t+p[3][1]*t*t*t;
x=(int)(xt);
y=(int)(yt);
lineto(x,y);
}
}
voidmain()
{
staticdoublep[4][2]={50,400,140,20,400,40,635,420};
constNO=3;/*特征顶点数*/
inti;
intdriver=DETECT,mode;
initgraph(&driver,&mode,"C:
\\TC20\\BGI");
cleardevice();
setcolor(BLUE);
moveto(p[0][0],p[0][1]);
for(i=1;i lineto(p[i][0],p[i][1]); bezier_3(LIGHTRED,p); getch();/*按ESC键退出*/ closegraph(); 四、实验结果及分析: 实验三: 二维图形的几何变换 一、实验目的: 1.掌握二维图形几何变换的基本原理及二维图形的几何算法。 2.巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可用简单图形得到复杂图形的理解。 3.通过编程完成二维图形的几何变换动态过程。 二、实验内容: 根据二维图形几何变换的基本原理及其变换矩阵: (1)编写实现二维图形平移、旋转变换的C语言程序; (2)编写实现二维图形错切、比例变换的C语言程序; 三、实验方法及编程: a)实现方法介绍 设置变换的参数变量,以便观察不同取值情况下的变换效果; b)实现代码及分析 #include #include #include #include doublexmax=639.0,ymax=399.0; doublef[3][3],xx,yy; intscx(doublexj) { intx; x=(int)(xj+xmax/2); return(x); } intscy(doubleyj) { inty; y=ymax-(int)(yj+ymax/2); return(y); } voidparallel(doubledx,doubledy) { f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=dx;f[2][1]=dy;f[2][2]=1.0; } voidscale(doubles) { f[0][0]=s;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=s;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } voidtaisho_y() { f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0; f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } voidaxis() { line(scx(0.0),scy(-ymax/2),scx(0),scy(ymax/2)); line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0)); } voidtuoq(doublea,doubleb) { f[0][0]=1.0;f[0][1]=b;f[0][2]=1.0; f[1][0]=a;f[1][1]=1.0;f[1][2]=0.0; f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0; } doubleaffinex(doublex,doubley,doubled) { xx=x*f[0][0]+y*f[1][0]+d*f[2][0]; return(xx); } doubleaffiney(doublex,doubley,doubled) { yy=x*f[0][1]+y*f[1][1]+d*f[2][1]; return(yy); } voiddrawtu(x2,y2) doublex2[5],y2[5]; { inti; for(i=0;i<=3;i++) { line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1])); } } voidmain() { intdrive=DETECT,mode; staticdoublex1[]={50.0,50.0,150.0,150.0,50.0}; staticdoubley1[]={0.0,100.0,100.0,0.0,0.0}; staticdoublex2[5],y2[5]; inti; doublex,y,xx,yy,yt; initgraph(&drive,&mode,"c: \\tc20\\bgi"); setcolor(YELLOW); axis(); for(i=0;i<=3;i++) { line(scx(x1[i]),scy(y1[i]),scx(x1[i+1]),scy(y1[i+1])); } /*parallel(100,-100)*///平行变换 getch(); x=100;y=-100; parallel(x,y); setcolor(GREEN); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"parallel(100,-100)"); /*taisho_y()*///关于y轴对称 getch(); taisho_y(); setcolor(RED); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"taisho_y"); /*touq(2,0)*///按比例增大 getch(); tuoq(2,0); setcolor(LIGHTRED); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"tuoq(2,0)"); /*scale (2)*///图像的增大 getch(); scale (2); setcolor(LIGHTBLUE); for(i=0;i<=4;i++) { x2[i]=affinex(x1[i],y1[i],1.0); y2[i]=affiney(x1[i],y1[i],1.0); } drawtu(x2,y2); yt=scy(y2[0])+10; outtextxy(scx(x2[0]),yt,"scale2"); getch(); closegraph(); }_ 四、实验结果及分析: 实验四: 计算机动画制作 一、实验目的: 1.掌握图形基于 TurboC环境生成的基本原理 2.学习使用cleardevice(),getimage()与putimage(),setactivepage()与setvisualpage()的配合使用。 二、实验内容: 理解计算机动画的不同生成方法; 采用某种动画生成方法设计制作一个动画小片断; 三、实验方法及编程: a)实现方法介绍 利用TurboC环境下的图形库函数,如cleardevice(),getimage()与putimage(),setactivepage()与setvisualpage()等来设计实现动画;所设计动画应有一定可观性。 b)实现代码及分析 #include #include #include main() { intgdriver=CGA,gmode=CGAC0,a[8],b[8],x,y,i,j,c; initgraph(&gdriver,&gmode,"C: \\TC\\BGI"); randomize(); for(;! kbhit();) { x=rand()%100+100; y=rand()%100+100; a[0]=x; b[0]=y; a[1]=a[0]+5; a[2]=a[1]+5; a[3]=a[1]; a[4]=a[0]; a[5]=a[0]-5; a[6]=a[5]-5; a[7]=a[6]+5; for(j=1;j<5;j++) b[j]=b[j-1]+5; for(j=5;j<8;j++) b[j]=b[j-1]-5; for(j=0;j<6;j++) { for(i=0;i<8;i++) { c=rand()%9+1; setcolor(c); circle(a[i],b[i],1); circle(a[i],b[i],3); } delay(100); cleardevice(); b[0]-=10; a[1]+=5; b[1]-=5; a[2]+=10; a[3]+=5; b[3]+=5; b[4]+=10; a[5]-=5; b[5]+=5; a[6]-=10; a[7]-=5; b[7]-=5; } } getch(); closegraph(); return(0); } 四、实验结果及分析: ( 。 =========================================================================== 2、计算机图形学实验课程小结和思考(包括感想、体会与启示) 通过这几次实验我学会了如何在边框中剪裁出一条直线,掌握了从边框中剪裁一条直线的原理。 不过对于算法和程序还是不是很熟,还需要进一步的加强! 两位老师在课堂上讲授许多关于计算机图形学的知识和原理,听起来有些枯燥无味,也不容易记住,死记硬背是不可取的。 然而要使用turbo.c2.0程序这个工具解决实际学习中的问题,通过多次上机练习,在理解的基础上就会自然而然地掌握计算机图形学图形生成的算法和处理方式。 对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,编写出来的程序无法运行,还需要多加练习。 老师在上机过程中谆谆教诲,细心回答我们的问题,让我们可以顺利完成试验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告 99719