当前位置:文档之家› 计算机图形学--图形几何变换实现

计算机图形学--图形几何变换实现

实验五 图形几何变换的实现班级:信计二班 学号: :解川 分数:一、实验目的为了掌握理解二维、三维的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用VC++语言实现二维、三维图形的基本变换与复合变换。

二、实验容(1) 理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换得以实现。

(2) 掌握二维、三维图形基本变换的原理及数学公式。

(3) 利用VC++语言实现二维、三维图形的基本变换、复合变换,在评不上显示变换过程或变换结果。

三、实验步骤(1) 预习教材关于二维、三维图形变换的原理与方法。

(2) 使用VC++语言实现某一种或几种基本变换。

(3) 调试、编译、运行程序。

四、原理分析源程序分别实现了对二维图形进行的平移变换—基本变换;对三维图形进行的绕某一个坐标轴旋转变换以及相对于立方体中心的比例变换—复合变换。

三维几何变换:(1) 比例变换:[]1111z y x =[]1z y x T 3D =[]1z y x ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡s n m l r j i h q f e d p c b q 局部比例变换:s T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1000000000000j e a 其中a 、b 、j 分别为在x 、y 、z 方向的比例系数。

整体比例变换:s T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡s 000010000100001其中s 为在xyz 方向的等比例系数。

S>1时,整体缩小;s<1时,整体放大。

(2) 旋转变换:旋转变换的角度方向为(沿坐标轴的反方向看去,各轴按逆时针方向旋转) 绕z 轴旋转:RZ T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-100010000cos sin 00sin cos θθθθ 绕x 轴旋转: RX T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000cos sin 00sin cos 00001θθθθ 绕y 轴旋转: RY T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000cos 0sin 00100sin 0cos θθθθ 程序代码: /*三维图形(立方体)旋转变换、比例变换*/#include <stdio.h>#include <math.h>#include <graphics.h>#include <conio.h>#include <time.h>#include <ctype.h>#define ZOOM_IN 0.9#define ZOOM_OUT 1.1int 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){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 trun2d(point *p,point2d *q){q->x=p->x+p->z*cos(0.25);q->y=p->y+p->z*sin(0.25);}void initm(float mat[][4]){int count;for(count=0;count<4;count++){mat[count][0]=0.;mat[count][1]=0.;mat[count][2]=0.;mat[count][3]=0.;mat[count][count]=1.;}return;}void transfrom(point *p,point *q,float tm[][4]){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;}void rotationx(point *p,float alfa,float tm[][4]){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]) {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;}void rotationy(point *p,float alfa,float tm[][4]) {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;}void adjust(point *p,point *q){float t[4][4];switch (turn1[0]){case 1:rotationy(p,2,t);transfrom(p,q,t);break;case -1:rotationy(p,-2,t);transfrom(p,q,t);break;default:break;}switch (turn1[1]){case 1:rotationz(p,2,t);transfrom(p,q,t);break;case -1:rotationz(p,-2,t);transfrom(p,q,t);break;default:break;}switch (turn1[2]){case 1:q->x=ZOOM_IN*p->x;q->y=ZOOM_IN*p->y;q->z=ZOOM_IN*p->z;break;case -1:q->x=ZOOM_OUT*p->x;q->y=ZOOM_OUT*p->y;q->z=ZOOM_OUT*p->z;break;default:break;}}void drawbox(fanti *p){point2d fan2d[8];int i;for(i=0;i<=7;i++){adjust(&p->biao[i],&p->biao[i]);trun2d(&p->biao[i],&fan2d[i]);fan2d[i].x+=300;fan2d[i].y+=200;}cleardevice();outtext(" -> :right <- :left ^ :up v :down");moveto(0,20);outtext(" page up:zoom in page down:zoom out space :Redraw Esc :exit");for(i=0;i<=3;i++){if(i==3){line(fan2d[i].x,fan2d[i].y,fan2d[0].x,fan2d[0].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[4].x,fan2d[4].y);}else{line(fan2d[i].x,fan2d[i].y,fan2d[i+1].x,fan2d[i+1].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[i+5].x,fan2d[i+5].y);}line(fan2d[i].x,fan2d[i].y,fan2d[i+4].x,fan2d[i+4].y);}}void main(){int gd=DETECT,gm,i,j;char key; float x,y,h;fanti a1; x=100; y=100; h=100;initgraph(&gd,&gm," ");setcolor(GREEN);make_box(x,y,h,&a1);for(;;){turn1[0]=0;turn1[1]=0;turn1[2]=0;key=getch();switch(key){case 77: turn1[0]=1;break; /*RIGHT*/ case 75: turn1[0]=-1;break; /*LIFT*/ case 72: turn1[1]=1;break; /*UP*/case 80: turn1[1]=-1;break; /*DOWN*/ case 73: turn1[2]=1;break; /*Zoom In*/ case 81: turn1[2]=-1;break; /*Zoom Out*/ case 32: make_box(x,y,h,&a1);break; /*Redraw*/ case 27: exit(0);break;default : key=0;break;}if(key!=0) drawbox(&a1);}closegraph();}五、实验结果:原始图形:左右旋转图形:上下旋转图形:放大图形:. . . .六、实验体会:在老师的细心指导下,利用本实验完成了在计算机中实现三维立体图形的缩放旋转,对立体图形有了更深层次的认识,对VC++有了更深层次的了解,让我对计算机产生了更深刻的兴趣。

相关主题