计算机图形学报告.docx
《计算机图形学报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学报告.docx(13页珍藏版)》请在冰豆网上搜索。
![计算机图形学报告.docx](https://file1.bdocx.com/fileroot1/2023-5/15/521f5846-58ba-4600-b9e8-bcf5bcc1451e/521f5846-58ba-4600-b9e8-bcf5bcc1451e1.gif)
计算机图形学报告
计算机图形学
实
验
报
告
学院:
班级:
学号:
姓名:
学院名称
专业班级
学号
学生姓名
实验日期
成绩
课程名称
计算机图形学
实验名称
实验一维基本图形生成的算法实现
一、实验目的:
1.通过实验,进一步理解和掌握DDA和中点算法,Bresenham算法;
2.掌握DDA和中点算法,Bresenham算法算法生成直线段的基本过程;掌握中点算法生成圆的基本过程;
3.通过编程,会在VC++环境下完成用DDA或中点算法实现直线段的绘制。
通过编程,会在VC++环境下完成用中点算法实现圆的绘制。
4.掌握二维图形显示原理;
二、实验环境:
普通PC386以上微机;VC++语言程序设计环境。
三、实验内容:
1、用DDA算法、中点算法或Besenham算法实现直线段的绘制。
2、用中点算法或Besenham算法实现圆的绘制。
3、对各种算法进行效率及效果的分析和比较;
四、实验源码:
DDA算法:
voidCmyView:
:
OnDDAline()
{
CDC*pDC=GetDC();
1”此可检查判断直线在窗口外,应全部舍弃。
C、果直线两端点不满足上述两种情况,不能简单地全部保留或全部舍弃直线时,则需要计算出直线与窗口边线的交点,将直线分段后继续进行检查判断。
这样可以逐段地舍弃位于窗口外地线段,保留剩余在窗口内的线段。
五、源码:
/*********定义裁剪函数************/
voidline_clip(intx1,inty1,intx2,inty2,intleft,inttop,intright,intbottom)
{
voidgetcode(intx,inty,intd[4]);/*定义获得端点的代码函数*/
inti,x11,y11;/*定义交点坐标*/
intaa=1;
getcode(x1,y1,a);
getcode(x2,y2,b);
/*1:
裁剪循环开始*/
while(aa!
=0)
{
if((a[0]+a[1]+a[2]+a[3]==0)&&(b[0]+b[1]+b[2]+b[3]==0))/*第一种情况线段完全可见*/
{
aa=0;
return;
}
elseif((a[0]&&b[0])+(a[1]&&b[1])+(a[2]&&b[2])+(a[3]&&b[3])!
=0)/*线段完全不可见*/
{
setcolor(0);
setwritemode(0);/*设置画线的输出模式为覆盖方式*/
line(x1,y1,x2,y2);/*进行裁剪也就是进行覆盖*/
aa=0;
return;
}
/*2:
线段即不完全可见,也不完全不可见,即与边有交点的线段的裁剪处理*/
else
{
if(a[0]+a[1]+a[2]+a[3]==0)/*寻找不可见点*/
{
for(i=0;i<4;i++)
c[i]=b[i];/*x2,y2为不可见点*/
}
else
{
for(i=0;i<4;i++)
c[i]=a[i];/*x1,y1为不可见点*/
}
/*3:
直线与窗口边作求交运算,求出交点赋值给x11、y11*/
if(c[0]==1)
{
x11=left;
y11=(int)((y2-y1)*(left-x1)/(x2-x1)+y1);
}
elseif(c[1]==1)
{
x11=right;
y11=(int)((y2-y1)*(right-x1)/(x2-x1)+y1);
}
elseif(c[2]==1)
{
x11=(int)((x2-x1)*(bottom-y1)/(y2-y1)+x1);
y11=bottom;
}
elseif(c[3]==1)
{
x11=(int)((x2-x1)*(top-y1)/(y2-y1)+x1);
y11=top;
}/*3:
求交运算结束*/
if((c[0]==a[0])&&(c[1]==a[1])&&(c[2]==a[2])&&(c[3]==a[3]))
{
setcolor(0);
setlinestyle(0,0,3);
setwritemode(0);
line(x1,y1,x11,y11);
x1=x11;y1=y11;
getcode(x11,y11,a);
}
elseif((c[0]==b[0])&&(c[1]==b[1])&&(c[2]==b[2])&&(c[3]==b[3]))
{
setcolor(0);
setlinestyle(0,0,3);
setwritemode(0);
line(x2,y2,x11,y11);
x2=x11;y2=y11;
getcode(x11,y11,b);
}
}/*2:
与边有交点的线段裁剪处理结束*/
}/*1:
裁剪循环结束*/
}
/*获得端点代码*/
voidgetcode(intx,inty,intd[4])
{
d[0]=0;d[1]=0;d[2]=0;d[3]=0;
if(xif(x>right)d[1]=1;
if(y>bottom)d[2]=1;
if(yreturn;
}
六、总结:
通过实验,理解了二维图形裁剪算法Sutherland_Hogman的基本原理;理解了图形裁剪的作用。
实验地点
指导教师
学院名称
计算机科学与技术
专业班级
学号
学生姓名
实验日期
2010年5月28日
成绩
课程名称
计算机图形学
实验名称
实验三图形的基本几何变换
一、实验目的:
1.掌握二维和三维图形基本的几何变换原理及变换矩阵;
2.掌握矩阵运算的程序设计。
3.使用VC++编程环境实现图形几何变换;
二、实验环境:
普通PC386以上微机;VC++语言程序设计环境。
三、实验内容:
1.在VC++编程环境下建立二维图形并实现该图形的基本变换,包括平移、旋转、比例。
2.在VC++编程环境下建立三维立方体,并实现其基本变换。
四、算法思想:
二维图形的缩放、旋转,平移,组合变换
在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:
平移变换:
[x*y*1]=[xy1]*
=[t*xs*y1]
比例变换:
[x*y*1]=[xy1]*
=[m+xn+y1]
旋转变换:
在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为
[x*y*1]=[xy1]*
=[x*cosө-y*sinө]
复合变换:
以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时
候,我们就要用到复合变换矩阵。
算法实现:
voidtf1(floatsq,floatcq,intxp,intyp)
{t[0][0]=cq;t[0][1]=sq;t[0][2]=0;
t[1][0]=-sq;t[1][1]=cq;t[1][2]=0;
t[2][0]=xp;t[2][1]=yp;t[2][2]=1;
}
voidtf2()
{floatx,y;
x=pp[j][0];y=pp[j][1];
pp[j][0]=x*t[0][0]+y*t[1][0]+t[2][0];
pp[j][1]=x*t[0][1]+y*t[1][1]+t[2][1];
}
main()
{
intgdriver,gmode,xp=300,yp=200;
floatp[][2]={{80,1},{80,8},{99,17},{97,26},{76,26}};
floati,t[3][3];
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"d:
\\tc");
setbkcolor(3);
cleardevice();
setcolor(9);
circle(xp,yp,70);
circle(xp,yp,20);
circle(xp,yp,40);
circle(xp,yp,5);
circle(xp,yp,2);
circle(xp,yp,45);
setlinestyle(0,0,6);
for(i=0;i<6;i=i+
{tf1(sin(i),cos(i),xp,yp);
for(j=0;j<5;j++)
{pp[j][0]=p[j][0];pp[j][1]=p[j][1];tf2();}
for(j=0;j<4;j++)
line(pp[j][0],pp[j][1],pp[j+1][0],pp[j+1][1]);
delay(10000);
}
getch();
closegraph();
}
五、总结:
通过实验,了解了二维图形基本变换的方法已经变换在图形绘制中的作用。
实验地点
指导教师
学院名称
计算机科学与技术
专业班级
学号
学生姓名
实验日期
2010年5月28日
成绩
课程名称
图形学
实验名称
实验四VC++图形程序设计
一、实验目的:
1.掌握VC++进行图形程序设计的基本方法;
2.了解VC++的图形功能,了解常见的图形库函数,请读者参见VC++帮助;
3.能设计较复杂的动、静态图形。
二、实验环境:
普通PC386以上微机;VC++语言程序设计环境。
三、实验内容:
1.图形系统初始化;
2.综合应用VC++中图形库函数,进行图形设计与绘制;
3.完成具有一定主题意义的静态或动态图形的设计与绘制。
四、实验源码:
#include<>
#include<>
#include<>
#include<>
#include<>
main()
{
srand(time(0));
intx1,x2,y1,y2,m,n,d=50;
floata,e,f,pi=;
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"\\tc");
setbkcolor(BLUE);
/*长瓣花型图*/
for(a=0;a<=2*pi;a+=pi/720)
{
e=d*(1+*cos(8*a));
f=e*(1+sin(16*a));
x1=150+f*cos(a);
x2=150+f*cos(a+pi/16);
y1=140-f*sin(a);
y2=140-f*sin(a+pi/16);
for(n=0;n<=320;n++)
{
m=rand();
setcolor(m);
line(x1,y1,x2,y2);
}
}
/*六瓣花型图*/
for(a=0;a<=2*pi;a+=pi/300)
{
e=d*(1+*cos(3*a));
f=e*(1+sin(6*a));
x1=200+f*cos(a);
x2=200+f*cos(a+pi/6);
y1=350-f*sin(a);
y2=350-f*sin(a+pi/6);
for(n=0;n<=200;n++)
{
m=rand();
setcolor(m);
line(x1,y1,x2,y2);
}
}
/*摹尔图*/
for(a=0;a<=2*pi;a+=pi/240)
{
f=80*(1+*cos*a)*sin*a));
x1=450+f*cos(a);
x2=450+f*cos(a+pi/4);
y1=230-f*sin(a);
y2=230-f*sin(a+pi/4);
for(n=0;n<=200;n++)
{
setcolor(14);
line(x1,y1,x2,y2);
}
}
getch();
closegraph();
}
五、实验结果:
六、总结:
通过图形程序的调试,激发了对图形学的兴趣,了解了图形学绘制图形的效果。
实验地点
指导教师