计算机图形学课程设计任务书.docx
《计算机图形学课程设计任务书.docx》由会员分享,可在线阅读,更多相关《计算机图形学课程设计任务书.docx(12页珍藏版)》请在冰豆网上搜索。
计算机图形学课程设计任务书
计算机科学系课程设计任务书
题目:
简单的小动画制作
学号:
20081
姓名:
专业:
计算机科学与技术
课程:
计算机图形学
指导教师:
刘彩霞职称:
完成时间:
2010年10月----2010年12月
枣庄学院计算机科学系制
2010年12月20日
课程设计任务书及成绩评定
课程设计的任务和具体要求
课程设计任务:
利用本学期学习的计算机图形学知识设计一个简单的二维图形生成程序。
通过完成一个完整的程序,经历策划、设计、开发、测试、总结和验收各阶段,达到巩固和实践计算机图形学课程中的理论和算法。
设计要求:
利用图形学的基本的算法语言,将其混合编写二维图像生成程序。
形成一个简单的小动画。
在其中培养认真学习和积极探索的精神。
指导教师签字:
日期:
指导教师评语
成绩:
指导教师签字:
日期:
课程设计所需软件、硬件等
所需软件:
Wintc软件、
所需硬件:
PC机一台
课程设计进度计划
起至日期
工作内容
备注
10.21-11.10
11.11-11.30
12.1-12.20
查找相关资料,对所编程序进行相应的分析
用c语言进行编程设计
对程序进行调试,并不断地修改完善
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
1计算机图形学教程陆润民清华大学出版社
2计算机图形学实践教程孔令德清华大学出版社
3c语言程序设计谭浩强清华大学出版社
摘要
计算机图形学随着计算机硬件技术和软件技术的发展以及科学技术不断进步而逐步完善起来,今天,它几乎可以给所有的生产和科研领域提供高效率的图形学技术的支持,并以成为“科学计算可视化”和“计算机辅助设计”两大领域的核心内容。
计算机图形学主要研究如何从真实的或虚拟的物体出发,为其在计算机内建立起相应的模型,并用画面描绘出来,所以在计算机图形学的研究和应用领域内,图形学软件的研究和开发必然要涉及到图形设备的研制和发展。
一、设计的主要步骤
1、算法简介:
(1)直线生成算法:
利用DDA算法,逐点描绘,根据给出的直线的两点坐标来绘制直线。
(2)曲线生成算法:
曲线在局部上可以近似的看成是一段段的小直线,利用DDA算法和给出的曲线函数逐段生成小线段。
最后就形成了曲线。
(3)平移变换:
平面上的一点(X,Y),如果在X轴方向上的平移增量为tx,在Y轴方向上平移增量为ty时,则平移后所得新点P’(x’,y’)坐标表达式为:
x’=x+tx y’=y+ty
如果对一图形的每个点都进行上述变换,即可得到该图的平移变换。
(4)比例变换:
一个图形中的坐标点(X,Y),若在X轴方向有一个比例系数sx,在Y轴方向有一个比例系数sy,则该图型的新坐标点(x’,y’)的表达式为
x’=x*sx y’=y*sy
这一变换是比例变换,将比例变化的点的坐标按重新绘制,即得到新的图形。
(5)对称变换:
经过变换后所得到的图形与变换前的图像关于X轴是对称的,则称此变换为关于X轴的对称变换。
经过这一变换后的坐标点(x’,y’)与变换前的对应坐标点(x’,y’)的关系为:
x’=x y’=-y
与此类似,若变换前后的图形关于Y轴对称,则称关于Y轴的对称变换。
这一变换前后点的坐标间的关系为:
x’=-x y’=-y
(6)区域填充:
区域填充一般分为边填充和种子填充。
这里使用边填充算法。
1.根据给出的顶点坐标数据,按y递增顺序建立边表。
2.根据活动边表指针,使之为空。
3.使yi=ymin(ymin为顶点坐标中最小的y值)。
4.反复做下述各步,直至yi=ymax(顶点坐标中y的最大值)或边表与活动边表。
a.将边表加入到活动边表中,并保持活动链中的记录按x值增大排序;
b.对扫描线yi依次成对取出活动边表中的xi值,并在每对xi之间填上所要求的颜色或图案。
c.从活动边表中删去yi=ymax的记录;
d.对保留下来的活动边表中的每个记录,用xi+1/m代替xi,并重新按x递增排序;
e.使yi+1,以便进入下一轮循环。
(7)图像裁剪:
裁减算法中最基本的情况是点的裁剪。
判断某一点(x,y)是否可见,可以利用下列一对不等式来确定该点是否在窗口范围内,
Wxl<=xw<=Wxr, Wyb<=yw<=Wyt
满足上述两个不等式的点即在窗口内,属于可见的点,应该保留;反之,则该点不可见,应予舍弃。
二、算法的具体代码:
(1)函数的DDA方法
ddaline(x1,y1,x2,y2) /*** 画线函数的DDA方法 ***/
{
inti1;
floatx,y,increx,increy,length;
if(abs(x2-x1)>abs(y2-y1))
length=abs(x2-x1);
else
length=abs(y2-y1);
increx=(x2-x1)/length;
increy=(y2-y1)/length;
x=x1; y=y1;
for(i1=1;i1 {
putpixel((int)(x+0.5),(int)(y+0.5),YELLOW);
x=x+increx;
y=y+increy;
}
}
drawline() /*** 画线的函数 ***/
{
inta,b,c,d;
intdriver=DETECT,mode;
printf("Input(x1,y1)and(x2,y2)!
\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
initgraph(&driver,&mode,"c:
\\tc");
ddaline(a,b,c,d);/*** 调用DDA方法 ***/
getch();
clearviewport();
closegraph();
}
(2)绘制曲线的函数
quxian()/*** 绘制曲线的函数 ***/
{
intxs,ys;
floatx,y,x1,y1,x2,y2,dx,i;
setup();
printf("Inputx1,x2anddx:
");
scanf("%f%f%f",&x1,&x2,&dx);
clearviewport();
setcolor(YELLOW);
xs=fnx(x1);ys=fny(0);moveto(xs-10,ys);
xs=fnx(x2);lineto(xs+10,ys);
xs=fnx(0);ys=fny
(2);moveto(xs,ys);
ys=fny(0);lineto(xs,ys);
x=x1;y=f(x);xs=fnx(x);ys=fny(y);moveto(xs,ys);
for(i=x1;i {
x+=dx;y=f(x);xs=fnx(x);
ys=fny(y);lineto(xs,ys);
moveto(xs,ys);
}
getch();
clearviewport();
restorecrtmode();
closegraph();
}
(3)比例变形的函数
bili()/*** 比例变形的函数 ***/
{
intxl,yb,xr,yt,driver=DETECT,mode;
intx0,y0,a,b,c,d;
printf("InputOrginx0,y0:
\n");
scanf("%d%d",&x0,&y0);
printf("Inputleft(xl,yb)andright(xr,yt):
\n");
scanf("%d%d%d%d",&xl,&yb,&xr,&yt);
printf("Inputbilimxandmy:
\n");
scanf("%d%d",&mx,&my);
initgraph(&driver,&mode,"c:
\\tc");
setcolor(YELLOW);
orgin(x0,y0);
a=xl;b=xr;c=yb;d=yt;
a=fpx(a);b=fpx(b); c=fpy(c);d=fpy(d);
line(a,c,b,c); line(a,c,a,d); line(b,d,b,c); line(a,d,b,d);
getch();
a=xl;b=xl+(xr-xl)*mx; c=yb;d=yb+(yt-yb)*my;
a=fpx(a);b=fpx(b); c=fpy(c);d=fpy(d);
line(a,c,b,c);line(a,c,a,d);line(b,d,b,c);line(a,d,b,d);
getch(); closegraph();
}
(3)填充函数:
fill()/*** 填充函数 ***/
{
intxl,yb,xr,yt,driver=DETECT,mode;
intx0,y0,a,b,c,d,h,w,p[2];
printf("InputOrginx0,y0:
\n");
scanf("%d%d",&x0,&y0);
printf("Inputleft(xl,yb)andright(xr,yt):
\n");
scanf("%d%d%d%d",&xl,&yb,&xr,&yt);
initgraph(&driver,&mode,"c:
\\tc");
setcolor(YELLOW);
orgin(x0,y0);
a=xl;b=xr;c=yb;d=yt;
a=fpx(a);b=fpx(b);
c=fpy(c);d=fpy(d);
moveto(a,c);
lineto(b,c); lineto(b,d); lineto(a,d); lineto(a,c);
getch();
for(w=0;w<=640;w++)
for(h=0;h<=480;h++)
{
p[0]=fpx(w);p[1]=fpy(h);
if(a<=p[0]&&p[0]<=b)
if(d<=p[1]&&p[1]<=c)
putpixel(p[0],p[1],RED);
}
getch();
closegraph();
}
(4)裁减函数
caijian()/*** 裁减函数 ***/
{
intxl,yb,xr,yt,driver=DETECT,mode;
intco,a,b,c;
printf("Inputthezonethatyouwanttocutoutpoints\nleft(xl,yt)andright(xr,yb):
\n");
scanf("%d%d%d%d",&xl,&yt,&xr,&yb);
initgraph(&driver,&mode,"c:
\\tc");
setcolor(YELLOW);
for(co=0;co<=400;co+=10)
circle(320,240,co);
getch();
c=getbkcolor();
for(a=0;a<=640;a++)
for(b=0;b<=yt;b++)
putpixel(a,b,c);
getch();
for(a=xr;a<=640;a++)
for(b=0;b<=480;b++)
putpixel(a,b,c);
getch();
for(a=0;a<=640;a++)
for(b=yb;b<480;b++)
putpixel(a,b,c);
getch();
for(a=0;a<=xl;a++)
for(b=0;b<=480;b++)
putpixel(a,b,c);
getch();
closegraph();
}
三、编写简单的小动画程序:
#include
#include
#include
#include
#defineTIME100
bezier(inta[],intb[],intcolor)
{intn=10000,i,j;
floatt,dt,x[8],y[8];
dt=1.0/n;t=dt;
while(t<=1)
{for(i=0;i<8;i++)
{x[i]=a[i];
y[i]=b[i];
}
for(j=6;j>=0;j--)
{for(i=0;i<=j;i++)
{x[i]=(1-t)*x[i]+t*x[i+1];
y[i]=(1-t)*y[i]+t*y[i+1];
}}
t=t+dt;
putpixel((int)x[0],(int)y[0],color);}
for(i=0;i<8;i++)
{putpixel(a[i],b[i],10);}
line(195,70,200,95);
line(225,70,220,95);}
main()
{intpcar[9][2]={5,350,90,350,90,335,70,335,65,320,25,320,20,335,5,335,5,350};
introad[5][2]={0,360,0,479,639,479,639,360,0,360};
intsky[5][2]={10,40,10,72,455,72,455,40,10,40};
inti,carcolor=RED;
void*carsize,*moonsize;
setbkcolor(LIGHTBLUE);setcolor(GREEN);
inta[8]={200,180,160,130,140,160,180,200};
intb[8]={95,90,85,80,100,120,140,150};
intc[8]={200,195,190,184,187,192,196,200};
intd[8]={150,152,154,156,160,164,168,172};
inte[8]={220,240,260,290,280,260,240,220};
intf[8]={220,225,230,236,233,228,224,220};
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"c:
\\tc");
cleardevice();
bezier(a,b,5);
bezier(c,d,5);
bezier(e,b,5);
bezier(f,d,5);
setfillstyle(SOLID_FILL,GREEN);
fillpoly(5,*road);
/*ThefunctiontopaintMoon*/
setcolor(WHITE);
arc(480,90,-120,120,50);arc(455,90,-90,90,44);
setfillstyle(SOLID_FILL,WHITE);
floodfill(505,90,WHITE);
/*ThefunctiontopaintaCAR*/
setcolor(carcolor);
setfillstyle(SOLID_FILL,carcolor);
fillpoly(9,*pcar);
setfillstyle(SOLID_FILL,DARKGRAY);
fillellipse(pcar[0][0]+15,350,10,10);
fillellipse(pcar[0][0]+65,350,10,10);
/*taketwoimagesofcarandmoon*/
moonsize=malloc(imagesize(450,40,540,140));
carsize=malloc(imagesize(0,320,90,360));
getimage(455,40,540,140,moonsize);
getimage(0,320,90,360,carsize);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
outtextxy(10,40,"PRESSANYKEYTOSTART");
getch();
/*clearastring*/
setcolor(LIGHTBLUE);
setfillstyle(SOLID_FILL,LIGHTBLUE);
fillpoly(5,*sky);
/*Nextprogramtocompleteamotion*/
for(i=1;i<=100;i++)
{
putimage(455-3*i,40,moonsize,COPY_PUT);
putimage(5*i,320,carsize,COPY_PUT);
delay(TIME);
}
setcolor(RED);
outtextxy(100,400,"PRESSANYKEYTORETURN");
getch();
free(carsize);free(moonsize);
closegraph();
}
四、运行结果如下图所示:
桌面首先显示一个用三次Breseham自动生成的蝴蝶:
然后清屏后出现小动画界面:
五、课程设计总结
在本次课程设计过程中,基本掌握了c语言提供的标准库函数,Breseham画曲线和画椭圆的方法。
了解关于图形学的知识,从中锻炼了自己的动手实验能力,但同时也看清了自己的水平,以便在以后的多加强有关这方面的学习,从而提升自己在图形学方面的知识。
在本次课程设计中。
设计方案存在一些问题但是希望自己在以后不断地加强学习,然后纠正错误。