计算机图形学实训.docx
- 文档编号:12600862
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:19
- 大小:1.95MB
计算机图形学实训.docx
《计算机图形学实训.docx》由会员分享,可在线阅读,更多相关《计算机图形学实训.docx(19页珍藏版)》请在冰点文库上搜索。
计算机图形学实训
课程实训报告
课程名称:
计算机图形学
二级学院:
汽车与电子工程学院
年级、专业:
2009级计算机科学与技术
学生姓名:
梅又川
学号:
0911050052
指导教师:
马味
完成时间:
2012年12月10日
《计算机图形学》课程实训
实训1简单图元的生成
一、实验目的
巩固计算机图形学和C语言程序设计的相关知识,初步了解通用图形软件包,了解常见的图元的生成方法,学会图形显示设备的初始化及其交互式图形生成的过程,锻炼程序调试的技巧。
二、实验环境
计算机、TurboC或其他C语言程序设计环境
三、实验内容
1.计算机中安装和配置TurboC程序设计环境;
2.了解TurboC的通用图形软件包的内容;
3.练习简单图元的生成(如直线、圆、长方形等)。
圆参考程序(运行环境TC2.0):
#include
#include
main()
{inti,r,xx[21],yy[21],x0,y0;
floatst=360/20*3.14/180;
intdriver=DETECT,mode=0;
x0=300;y0=250;r=200;
initgraph(&driver,&mode,"");
setbkcolor(BLUE);setcolor(YELLOW);
for(i=0;i<21;i++)
{xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st);}
for(i=0;i<20;i++)
line(xx[i],yy[i],xx[i+1],yy[i+1]);
getch();closegraph();
}
四、实验步骤
1.安装和配置TurboC程序设计环境;
1.1安装和配置TurboC的运行环境。
在Options的菜单下的Directories下进行配置,如图所示:
1.2对TurboC的配置和设置的运行环境进行保存,即SaveOptions。
2.了解TurboC的通用图形软件包的内容;
3.编写生成简单的图元的程序;
3.1圆的参考程序:
#include
#include
main()
{inti,r,xx[21],yy[21],x0,y0;
floatst=600/20*3.14/180;
intdriver=DETECT,mode=0;
x0=300;y0=250;r=200;
initgraph(&driver,&mode,"");
setbkcolor(BLUE);setcolor(YELLOW);
for(i=0;i<21;i++)
{xx[i]=x0+r*cos(i*st);yy[i]=y0-r*sin(i*st);}
for(i=0;i<20;i++)
line(xx[i],yy[i],xx[i+1],yy[i+1]);
getch();closegraph();
}
3.2长方形的参考程序:
#include"graphics.h"
#include"conio.h"
#include"stdio.h"
intcwc(){int*graphdriver=DETECT,
*graphmode,n,m,a,b,i,j,p,q,w,s,k;printf("\n\npleaseinputfourzuobiao:
");scanf("%d%d%d%d",&n,&m,&a,&b);printf("\nsetgraphwindow:
");scanf("%d%d%d%d%d",&p,&q,&w,&s,&k);
printf("\npleaseinputtwocolour:
");
scanf("%d%d",&i,&j);
initgraph(&graphdriver,&graphmode,"c:
\\tc");
cleardevice();
setcolor(i);
setbkcolor(j);
etviewport(p,q,w,s,k);
rectangle(n,m,a,b);
getch();
clearviewport();
closegraph();}voidmain(){intc;textbackground(LIGHTBLUE);
textcolor(10);
clrscr();
printf("Doyouwanttoinputdrowdata(Y/N):
");
c=getchar();getchar();while(c=='Y'||c=='y'){printf("\n\nyouhavechangedsetbkcolor:
\n\nCYAN=3WHITE=15\n");cwc();}}4.调试程序,运行程序并观看运行结果;
4.1圆的运行结果为,如图所示:
4.2长方形的运行结果为,如图所示:
5.对运行结果进行分析。
调用画长方形函数,需要给出矩形左上角和右下角的坐标。
调用圆的函数,需要给出圆的坐标和半径,使用C语言绘制图形时,通常要调用setbkcolor函数和cleardevice函数。
在绘制给个图形的时,需要给出一定的横、纵坐标。
《计算机图形学》课程实训
实训2直线和椭圆的绘制
一、实验目的
1.通过实验,进一步理解和掌握DDA和中点算法;
2.掌握以上算法生成直线段、椭圆或圆的基本过程;
3.通过编程,会在TC环境下完成用DDA或中点算法实现直线段、椭圆或圆的绘制。
二、实验环境
计算机、TurboC或其他C语言程序设计环境
三、实验内容
用DDA算法或中点(Besenham)算法实现直线段、椭圆或圆的绘制。
参考程序
#include
#include
main()
{intdriver=DETECT,mode=0;
initgraph(&driver,&mode,"");
ddaline(0,0,640,480,4);
ddaline(0,480,640,0,3);
setcolor
(1);
getch();
closegraph();
}
ddaline(intx0,inty0,intx1,inty1,intcolor)
{
intx;
floatdx,dy,k,y;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
y=y0;
for(x=x0;x<=x1;x++)
{
putpixel(x,(int)(y+0.5),color);
y=y+k;
}
}
四、实验步骤
1.算法、原理清晰,有详细的设计步骤;
1.1直线的算法:
与中点算法类似,Bresenham算法也是通过在每列像素中确定与理想直线最近的像素来进行直线扫描转换的。
为了讨论方便,此处假定直线的斜率在0,1之间。
对直线对直线
,左下方的端点为
(x0,y0),右上方的端点为
(x1,y1)。
如图,由
到
,则d=d+m,一旦d
1时,d=d-1,以保证d始终在0,1之间。
初始条件为:
1.2椭圆的算法:
中点椭圆算法内容:
1.输入椭圆的两个半径r1和r2,并且输入椭圆的圆心。
设置初始点(x0,y0)的位置为(0,r2);
2.计算区域1中央决策参数的初始值p=ry*ry-rx*rx*ry+1/4*(rx*rx);
3.在区域1中的每个Xn为止,从n=0开始,直到|K|(斜率)小于-1时后结束;
(1)如果p<0,绘制下一个点(x+1,y),并且计算p=p+r2*r2*(3+2*x);
(2)如果P>=0,绘制下一个点(x+1,y-1),并且计算
p=p+r2*r2*(3+2*point.x)-2*r1*r1*(y-1)
1.3圆的算法:
中点Bresenham算法的原理圆心在原点、半径为R的圆方程的隐函数表达式为:
圆将平面划分成三个区域:
对于圆上的点,F(x,y)=0;对于圆外的点,F(x,y)>0;对于圆内的点,F(x,y)<0。
事实上,考虑到圆在第一象限内的对称性,本算法可以进一步简化。
用四条对称轴x=0,y=0,x=y,x=-y把圆分成8等份。
只要绘制出第一象限内的1/8圆弧,根据对称性就可绘制出整圆,这称为八分法画圆算法。
假定第一象限内的任意点为P(x,y),可以顺时针确定另外7个点:
P(y,x),P(y,-x),P(x,-y),P(-x,-y),P(-y,-x),P(-y,x),P(-x,y)。
2.依据算法、步骤或程序流程图,用C语言编写源程序;
#include
#include
main()
{intdriver=DETECT,mode=0;
initgraph(&driver,&mode,"");
ddaline(0,0,640,480,4);
ddaline(0,480,640,0,3);
setcolor
(1);
getch();
closegraph();
}
ddaline(intx0,inty0,intx1,inty1,intcolor)
{
intx;
floatdx,dy,k,y;
dx=x1-x0;
dy=y1-y0;
k=dy/dx;
y=y0;
for(x=x0;x<=x1;x++)
{
putpixel(x,(int)(y+0.5),color);
y=y+k;
}
}
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
《计算机图形学》课程实训
实训3 图形变换
一、实验目的
1、掌握2维与3维图形变换矩阵
2、在TC2.0环境下,编写程序实现二维图形的变换。
二、实验环境
计算机、TurboC或其他C语言程序设计环境
三、实验内容
参考二维图形变换通用子程序AFFINE.C,编写程序实现将一四边形作平移变换。
2.参考二维图形变换通用子程序AFFINE.C,编写程序将一四边形作旋转360度。
四、实验步骤
1.算法、原理清晰,有详细的设计步骤;
设Tx,Ty,Tz是物体在三个坐标方向上的移动量,则有公式:
x′=x+Tx
y′=y+Ty
z′=z+Tz
矩阵运算表达为:
[x′y′z′1]=[xyz1]
2.依据算法、步骤或程序流程图,用C语言编写源程序;
参考程序:
doublesin(),cos();
doublexmax=639.0,ymax=399.0;
doublef[3][3],xx,yy;
scx(xj)
doublexj;
{intx;x=(int)(xj+xmax/2);return(x);}
scy(yj)
doubleyj;
{inty;y=ymax-(int)(yj+(ymax/2));return(y);}
parallel(dx,dy)
doubledx,dy;
{
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;
}
rotate(theta)
doubletheta;
{
doubleth;
th=theta/180*3.1415927;
f[0][0]=cos(th);f[0][1]=sin(th);f[0][2]=0.0;
f[1][0]=-sin(th);f[1][1]=cos(th);f[1][2]=0.0;
f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}
scale(s)
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;
}
taisho_x()
{
f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;
f[1][0]=0.0;f[1][1]=-1;f[1][2]=0.0;
f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}
taisho_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;f[1][2]=0.0;
f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}
taisho_o()
{
f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;
f[1][0]=0.0;f[1][1]=1;f[1][2]=0.0;
f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}
taisho_xy()
{
f[0][0]=0.0;f[0][1]=0.0;f[0][2]=0.0;
f[1][0]=1.0;f[1][1]=0.0;f[1][2]=0.0;
f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}
taisho(aa,bb,cc)
{
floatr,p;
r=bb*bb-aa*aa;p=aa*aa+bb*bb;
f[0][0]=-r/p;f[0][1]=-2*aa*bb/p;f[0][2]=0.0;
f[1][0]=-2*aa*bb/p;f[1][1]=-r/p;f[1][2]=0.0;
f[2][0]=-2*aa*cc/p;f[2][1]=-2*bb*cc/p;f[2][2]=1.0;
}
shear(c,b)
doublec,b;
{
f[0][0]=1.0;f[0][1]=b;f[0][2]=0.0;
f[1][0]=c;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;
}
axis()
{
line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2));
line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0));
}
affinex(x,y,d)
doublex,y,d;
{
xx=x*f[0][0]+y*f[1][0]+d*f[2][0];return(xx);
}
affiney(x,y,d)
doublex,y,d;
{
yy=x*f[0][1]+y*f[1][1]+d*f[2][1];return(yy);
}
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
《计算机图形学》课程实训
实训4区域填充和图形的裁剪
一、实验目的
1.通过实验,进一步理解和掌握扫描线填充算法;
2.掌握用扫描线填充算法进行区域填充的基本过程;
3.通过编程,会在TC环境下用扫描线填充算法编程实现一个饼型图的绘制;
4.通过实验,进一步理解和掌握Sutherland裁剪算法;
5.掌握用Sutherland裁剪算法裁减多边形的基本过程;
6.通过编程,会在TC环境下用Sutherland算法编程实现用矩形窗口对多边形的裁剪。
二、实验环境
计算机、TurboC或其他C语言程序设计环境
三、实验内容
1.用扫描线填充算法编程实现一个彩色饼型图的绘制;
2.用Sutherland算法编程实现用矩形窗口对多条直线的裁剪。
四、实验步骤
1.算法、原理清晰,有详细的设计步骤;
对于每条线段P1P2,分为三种情况处理。
a.若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。
b.若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。
c.若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。
其中一段完全在窗口外,可弃之。
然后对另一段重复上述处理。
2.依据算法、步骤或程序流程图,用C语言编写源程序;
参考程序:
#include
#include
intlt,rt,bm,tp;
intwx[2],wy[2],wt[2],wb[2],wl[2],wr[2];
voidexlip(intwx[2],intwy[2]);
voidflagw(int*pti,intwx[2],intwy[2])
{inti=*pti;
wt[i]=0;wb[i]=0;wl[i]=0;wr[i]=0;
if(wx[i]
if(wy[i]
voidexclip(intwx[2],intwy[2])
{inti;
if(wl[0]*wl[1]+wr[0]*wr[1]+wt[0]*wt[1]+wb[0]*wb[1]!
=0)return;
i=0;
if(wl[0]+wr[0]+wt[0]+wb[0]==0)
{
i=1;
if(wl[1]+wr[1]+wt[1]+wb[1]==0)
{line(wx[0],wy[0],wx[1],wy[1]);return;}
}
if(wl[i]==1)
{
wy[i]=wy[0]+(wy[1]-wy[0])*(lt-wx[0])/(wx[1]-wx[0]);
wx[i]=lt;flagw(&i,wx,wy);exclip(wx,wy);}
if(wr[i]==1)
{wy[i]=wy[0]+(wy[1]-wy[0])*(rt-wx[0])/(wx[1]-wx[0]);
wx[i]=rt;flagw(&i,wx,wy);exclip(wx,wy);}
if(wt[i]==1)
{
wx[i]=wx[0]+(wx[1]-wx[0])*(tp-wy[0])/(wy[1]-wy[0]);
wy[i]=tp;flagw(&i,wx,wy);exclip(wx,wy);}
if(wb[i]==1)
{
wx[i]=wx[0]+(wx[1]-wx[0])*(bm-wy[0])/(wy[1]-wy[0]);
wy[i]=bm;flagw(&i,wx,wy);exclip(wx,wy);
}
}
voidclip(intleft,inttop,intright,intbottom,intpx,intpy,intqx,intqy)
{
intui;
lt=left;rt=right;bm=bottom;tp=top;
wx[0]=px;wy[0]=py;wx[1]=qx;wy[1]=qy;
setcolor(4);
line(px,py,qx,qy);
setcolor
(2);
for(ui=0;ui<2;ui++)flagw(&ui,wx,wy);exclip(wx,wy);
}
main()
{
intdriver=DETECT,mode=0;
initgraph(&driver,&mode,"");
setbkcolor(BLUE);setcolor(YELLOW);
rectangle(140,100,340,340);
clip(140,100,340,340,200,300,250,250);
clip(140,100,340,340,250,400,400,200);
clip(140,100,340,340,70,200,250,240);
getch();closegraph();
}_
3.编辑源程序并进行调试;
4.进行运行测试,并结合情况进行调整;
5.对运行结果进行保存与分析;
Cohen-SutherLand裁剪算法的原理。
了解了如何快速的判断一条线段与窗口属何种关系,采用延长窗口的边,把未经裁剪的图形区域分为九个区,然后每个区用四位代码表示,从左到右各位依次表示上下左右。
6.打印源程序或把源程序以文件的形式提交;
7.按格式书写实验报告。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学