资源描述
计算机图形学
实验指导书
陈华光、陈多、刘长松编
专业班级 计算机0902 _
姓 名 田 鹏 _
学 号 200903010225 _
湖南工程学院
二○一二年六月
计算机图形学实验报告四
实验名称 绘制简单的三维图形 评分 _
实验日期 2012 年 6 月 12 日 指导教师 李长松 _
姓名 专业班级 计算机0902 学号 200903010211 _
一、实验目的
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函数在顶点之间两两连线。
3、将每一个几何变换编写成一个函数,在主程序中进行坐标变换时,直接调用相应的函数即可;变换后调用绘图函数用不同颜色在屏幕上绘出变换后的图形。
四、程序调试中的问题
用matlab绘制二维与三维曲线和三维曲面的过程中,不能灵活使用一些常用的绘图函数如mesh,surf等。
五、程序运行结果或数据
x=-5:0.1:5;y=-4:0.1:4;
[x,y]=meshgrid(x,y);
z=0.5*x.^3+y.^2;
subplot(2,2,1);
mesh(x,y,z);
title(‘三维网格曲面’)
subplot(2,2,2);
surf(x,y,z);
title(‘三维曲面’)
subplot(2,2,3);
meshc(x,y,z);
title(‘三维网格曲面(带有等值线)’)
subplot(2,2,4);
surfc(x,y,z);
title(‘三维曲面(带有等值线)’)
六、实验收获及体会
通过这次实验使我对二维和三维图形的绘制,使我更加了解了图形的绘制过程,提高了动手能力,使我能够在以后解决其它问题时使用matlab作图更加熟练。
参考源程序(可附页)
#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();
}
展开阅读全文