. . . .
实验五 图形几何变换的实现
班级:信计二班 学号: :解川 分数: 一、实验目的
为了掌握理解二维、三维的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用VC++语言实现二维、三维图形的基本变换与复合变换。 二、实验容
(1) 理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换
得以实现。
(2) 掌握二维、三维图形基本变换的原理及数学公式。
(3) 利用VC++语言实现二维、三维图形的基本变换、复合变换,在评不上显
示变换过程或变换结果。 三、实验步骤
(1) 预习教材关于二维、三维图形变换的原理与方法。 (2) 使用VC++语言实现某一种或几种基本变换。 (3) 调试、编译、运行程序。 四、原理分析
源程序分别实现了对二维图形进行的平移变换—基本变换;对三维图形进行的绕某一个坐标轴旋转变换以及相对于立方体中心的比例变换—复合变换。 三维几何变换:
(1) 比例变换:
?x1y1z11?=?xyz1?T3D=?xy?qb?dez1???hi??lmcfjnp?q?? r??s?局部比例变换:
?a?0Ts=?
?0??0000?e00??其中a、b、j分别为在x、y、z方向的比例系数。 0j0?
?
001?
. . . . .
. . . .
整体比例变换:
?1?0Ts=??0??0000?100??其中s为在xyz方向的等比例系数。S>1时,整体缩小;s<1时,整体放010??00s?大。
(2) 旋转变换:
旋转变换的角度方向为(沿坐标轴的反方向看去,各轴按逆时针方向旋转) 绕z轴旋转:
?cos???sin?TRZ=??0??0绕x轴旋转:
sin?cos?00000?00?? 10??01?0?0?? 0??1?0?0?? 0??1?0?1?0cos?TRX=??0?sin??0?0绕y轴旋转:
sin?cos?0?cos??0TRY=??sin???0程序代码:
0?sin?1000cos?0/*三维图形(立方体)旋转变换、比例变换*/ #include
. . . . .
. . . .
int turn1[3];/*[0]rx,[1]ry,[3]zoom*/ typedef struct {
float x; float y; float z;
}point; typedef struct {
float x; float y;
}point2d; typedef struct {
float x; float y; float h; point biao[8];
}fanti;
void make_box(float x,float y,float h,fanti *p) { }
void trun2d(point *p,point2d *q) {
q->x=p->x+p->z*cos(0.25); q->y=p->y+p->z*sin(0.25); p->x=x;p->y=y;p->h=h;
p->biao[0].x=x/2; p->biao[0].y=y/2; p->biao[0].z=h/2; p->biao[1].x=-x/2; p->biao[1].y=y/2; p->biao[1].z=h/2; p->biao[2].x=-x/2; p->biao[2].y=-y/2; p->biao[2].z=h/2; p->biao[3].x=x/2; p->biao[3].y=-y/2; p->biao[3].z=h/2; p->biao[4].x=x/2; p->biao[4].y=y/2; p->biao[4].z=-h/2; p->biao[5].x=-x/2; p->biao[5].y=y/2; p->biao[5].z=-h/2; p->biao[6].x=-x/2; p->biao[6].y=-y/2; p->biao[6].z=-h/2; p->biao[7].x=x/2; p->biao[7].y=-y/2; p->biao[7].z=-h/2;
. . . . .
. . . .
}
void initm(float mat[][4]) { }
void transfrom(point *p,point *q,float tm[][4]) { }
void rotationx(point *p,float alfa,float tm[][4]) { }
. . . . .
int count;
for(count=0;count<4;count++) { } return;
mat[count][0]=0.; mat[count][1]=0.; mat[count][2]=0.; mat[count][3]=0.; mat[count][count]=1.;
float xu,yv,zw,h;
xu=tm[0][0]*p->x+tm[1][0]*p->y+tm[2][0]*p->z+tm[3][0]; yv=tm[0][1]*p->x+tm[1][1]*p->y+tm[2][1]*p->z+tm[3][1]; zw=tm[0][2]*p->x+tm[1][2]*p->y+tm[2][2]*p->z+tm[3][2]; p->x=xu; p->y=yv; p->z=zw; return;
float rad=0.0174532925; initm(tm);
tm[1][1]=cos(rad*alfa); tm[1][2]=sin(rad*alfa); tm[2][1]=-tm[1][2]; tm[2][2]=tm[1][1]; return;
. . . .
void rotationz(point *p,float alfa,float tm[][4]) { }
void rotationy(point *p,float alfa,float tm[][4]) { }
void adjust(point *p,point *q) {
float t[4][4]; switch (turn1[0]) {
case 1: }
switch (turn1[1])
rotationy(p,2,t); transfrom(p,q,t); break;
float rad=0.0174532925; initm(tm);
tm[0][0]=cos(rad*alfa); tm[2][0]=sin(rad*alfa); tm[0][2]=-tm[2][0]; tm[2][2]=tm[0][0]; return;
float rad=0.0174532925; initm(tm);
tm[0][0]=cos(rad*alfa); tm[0][1]=sin(rad*alfa); tm[1][0]=-tm[0][1]; tm[1][1]=tm[0][0]; return;
case -1:
rotationy(p,-2,t); transfrom(p,q,t); break;
default:break;
. . . . .
计算机图形学--图形几何变换实现
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)