资源描述
个人收集整理 勿做商业用途
计算机图形学实验报告
实验名称 绘制简单的三维图形 评分
实验日期 年 月 日 指导教师
姓名 专业班级 学号
一、实验目的
1、复习用二维图来表示三维立体图形,三视图的表示及的三视图的变换矩阵
2、掌握用C语言编程实现三维简单立体的正等测投影的绘制
3、掌握用C语言编程实现三维简单立体的三视图的绘制
4、掌握用C语言编程实现三维简单立体的透视图的绘制
5、用C语言编写的图形变换函数
二、实验要求
1、在屏幕上绘制出一个长方体或简单几何体的正等测投影的几何图形,要求在图形下方标出是正等侧、还是正二侧投影图形。
2、在屏幕上绘制出一个长方体或简单几何体的三视图投影图形,要求在图形下方标出是什么投影图形。
3、在屏幕上绘制出一个长方体或简单几何体的透视投影图形。
三、 关键算法及实现原理
1、二维屏幕表示三维立体图的关键:屏幕是一个二维的平面空间,要在它上做出三维的图形,就必须把三维的空间图形通过一个投影变换变为二维的图形,即投影变换把三维坐标点(x,y,z)变为(x’,0,z’)。
2、 投影变换的类型
3、按下述步骤编写绘制三维图形的函数
① 在草稿纸上给出草图,并确定各顶点的序号和相应的顶点坐标值,建立顶点表和连边表。
② 在程序中定义三个数组,用于存放顶点的(x,y,z)的坐标值。
③ 实施对立方体进行相应的投影变换,即对顶点矩阵与变换矩阵相乘,得到一个新的顶点矩阵。
④ 用新顶点表的坐标值,注意些时只有x坐标和z坐标,y坐标已在投影中消掉,按边表的连线规则,用line函数在顶点之间两两连线。
4、将每一个几何变换编写成一个函数,在主程序中进行坐标变换时,直接调用相应的函数即可;变换后调用绘图函数用不同颜色在屏幕上绘出变换后的图形。
四、程序调试中的问题
五、程序运行结果或数据
#include〈graphics。h>
#include〈conio.h>
#include〈dos.h〉
#include〈math。h>
double xmax=639。0, ymax=399.0;
double f[4][4],xx,yy,zz,dd;
int scx(double xj)
{ int x;
x=(int)(-xj+xmax/2);
return(x);
}
int scy(double yj)
{ int y;
y=ymax-(int)(yj+ymax/2);
return(y);
}
void tv()
{
f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0。0;f[0][3]=0.0;
f[1][0]=0。0;f[1][1]=0.0;f[1][2]=0。0;f[1][3]=0.0;
f[2][0]=0。0;f[2][1]=0.0; f[2][2]=1.0;f[2][3]=0.0;
f[3][0]=0。0;f[3][1]=0.0; f[3][2]=1。0;f[3][3]=1。0;
}
void th( int n)
{
f[0][0]=1。0;f[0][1]=0.0;f[0][2]=0.0;f[0][3]=0。0;
f[1][0]=0。0;f[1][1]=0.0;f[1][2]=—1.0;f[1][3]=0.0;
f[2][0]=0。0;f[2][1]=0。0; f[2][2]=0.0;f[2][3]=0。0;
f[3][0]=0.0;f[3][1]=0。0; f[3][2]=-n;f[3][3]=1。0;
}
void tw( int d)
{
f[0][0]=0。0;f[0][1]=0。0;f[0][2]=0.0;f[0][3]=0。0;
f[1][0]=-1。0;f[1][1]=0.0;f[1][2]=0.0;f[1][3]=0。0;
f[2][0]=0.0;f[2][1]=0.0; f[2][2]=1.0;f[2][3]=0。0;
f[3][0]=—d;f[3][1]=0.0; f[3][2]=0。0;f[3][3]=1。0;
}
void teq()
{
f[0][0]=0。707;f[0][1]=0.0;f[0][2]=—0.408;f[0][3]=0.0;
f[1][0]=-0.707;f[1][1]=0。0;f[1][2]=—0.408;f[1][3]=0.0;
f[2][0]=0。0;f[2][1]=0.0; f[2][2]=0。816;f[2][3]=0.0;
f[3][0]=0.0;f[3][1]=0。0; f[3][2]=0。0;f[3][3]=1.0;
}
void tt1yq(double l,double n,double m,double q)
{
f[0][0]=1。0;f[0][1]=0.0;f[0][2]=0。0;f[0][3]=0.0;
f[1][0]=0.0;f[1][1]=0。0;f[1][2]=0.0;f[1][3]=q;
f[2][0]=0.0;f[2][1]=0.0; f[2][2]=1.0;f[2][3]=0。0;
f[3][0]=l;f[3][1]=0.0; f[3][2]=n;f[3][3]=m*q+1;
}
void axis()
{
line(scx(0.0),scy(ymax/2),scx(0),scy(0。0));
line(scx(0),scy(0),scx(xmax/2),scy(-ymax/2)—19);
line(scx(0),scy(0),scx(-xmax/2),scy(—ymax/2)-19);
outtextxy(scx(0),ymax/2+10,”O");
outtextxy(scx(-xmax/2+10),scy(—ymax/2)—10,"Y”);
outtextxy(scx(xmax/2),scy(-ymax/2)-10,"X”);
outtextxy(scx(0)+3,scy(ymax/2)+6,”Z");
}
double affine3x(double x,double y,double z,double d)
{
xx=x*f[0][0]+y*f[1][0]+z*f[2][0]+d*f[3][0];
return(xx);
}
double affine3y(double x,double y,double z,double d)
{
yy=x*f[0][1]+y*f[1][1]+z*f[2][1]+d*f[3][1];
return(yy);
}
double affine3z(double x,double y,double z,double d)
{
zz=x*f[0][2]+y*f[1][2]+z*f[2][2]+d*f[3][2];
return(zz);
}
double affine3d(double x,double y,double z,double d)
{
dd=x*f[0][3]+y*f[1][3]+z*f[2][3]+d*f[3][3];
return(dd);
}
void draw(x1,z1)
double x1[8],z1[8];
{
line(scx(x1[0]),scy(z1[0]),scx(x1[1]),scy(z1[1]));
line(scx(x1[0]),scy(z1[0]),scx(x1[3]),scy(z1[3]));
line(scx(x1[1]),scy(z1[1]),scx(x1[2]),scy(z1[2]));
line(scx(x1[2]),scy(z1[2]),scx(x1[3]),scy(z1[3]));
line(scx(x1[2]),scy(z1[2]),scx(x1[1]),scy(z1[1]));
line(scx(x1[3]),scy(z1[3]),scx(x1[4]),scy(z1[4]));
line(scx(x1[2]),scy(z1[2]),scx(x1[7]),scy(z1[7]));
line(scx(x1[1]),scy(z1[1]),scx(x1[6]),scy(z1[6]));
line(scx(x1[4]),scy(z1[4]),scx(x1[7]),scy(z1[7]));
line(scx(x1[4]),scy(z1[4]),scx(x1[5]),scy(z1[5]));
line(scx(x1[6]),scy(z1[6]),scx(x1[7]),scy(z1[7]));
line(scx(x1[6]),scy(z1[6]),scx(x1[5]),scy(z1[5]));
line(scx(x1[5]),scy(z1[5]),scx(x1[0]),scy(z1[0]));
}
void main()
{int drive=DETECT,mode;
static double x0[]={60。0,0。0,0。0,175。0,175.0,60。0,0.0,0。0};
static double y0[]={75.0,75。0,75。0,75.0,0。0,0.0,0。0,0.0};
static double z0[]={125.0,125。0,0.0,0.0,0。0,125。0,125.0,0。0};
static double x1[8],y1[8],z1[8],dd[8];
static double x2[8],y2[8],z2[8];
static double x3[8],y3[8],z3[8];
int i;
double x,xx,yy,zz,zt;
initgraph(&drive,&mode,"c:\\tc3\\bgi");
axis();
teq();
for(i=0;i〈=7;i++)
{
x1[i]=affine3x(x0[i],y0[i],z0[i],1.0);
y1[i]=affine3y(x0[i],y0[i],z0[i],1。0);
z1[i]=affine3z(x0[i],y0[i],z0[i],1.0);
}
setcolor(RED);
draw(x1,z1);
zt=scy(z1[0])+10;
outtextxy(scx(x1[0]),zt,"tequ ");
getch();
tw(20);
for(i=0;i〈=7;i++)
{
x1[i]=affine3x(x0[i],y0[i],z0[i],1.0);
y1[i]=affine3y(x0[i],y0[i],z0[i],1。0);
z1[i]=affine3z(x0[i],y0[i],z0[i],1.0);
}
setcolor(BLUE);
draw(x1,z1);
zt=scy(z1[0])+10;
outtextxy(scx(x1[0]),zt,”tw ");
getch();
th(20);
for(i=0;i<=7;i++)
{
x1[i]=affine3x(x0[i],y0[i],z0[i],1.0);
y1[i]=affine3y(x0[i],y0[i],z0[i],1。0);
z1[i]=affine3z(x0[i],y0[i],z0[i],1。0);
}
setcolor(BLUE);
draw(x1,z1);
zt=scy(z1[0])+10;
outtextxy(scx(x1[0]),zt,”th ”);
getch();
tv();
for(i=0;i〈=7;i++)
{
x1[i]=affine3x(x0[i],y0[i],z0[i],1。0);
y1[i]=affine3y(x0[i],y0[i],z0[i],1.0);
z1[i]=affine3z(x0[i],y0[i],z0[i],1。0);
}
setcolor(BLUE);
draw(x1,z1);
zt=scy(z1[0])+10;
outtextxy(scx(x1[0]),zt,”tv ”);
getch();
tt1yq(10。0,—20。0,-30。0,-0。005);
for(i=0;i〈=7;i++)
{
x1[i]=affine3x(x0[i],y0[i],z0[i],1.0);
y1[i]=affine3y(x0[i],y0[i],z0[i],1。0);
z1[i]=affine3z(x0[i],y0[i],z0[i],1。0);
dd[i]=affine3d(x0[i],y0[i],z0[i],1.0);
x1[i]=x1[i]/dd[i]-250;
y1[i]=y1[i]/dd[i];
z1[i]=z1[i]/dd[i];
}
setcolor(GREEN);
draw(x1,z1);
getch();
closegraph();
}
六、实验收获及体会
1、用C语言编程实现三维简单立体的正等测投影的绘制。
2、用C语言编程实现三维简单立体的三视图的绘制。
3、用C语言编程实现三维简单立体的透视图的绘制。
4、用C语言编写的图形变换函数
展开阅读全文