计算机图形学
- 格式:doc
- 大小:442.50 KB
- 文档页数:20
实验报告实验课程:计算机图形学实验报告学生姓名:牟松波学号:20126012专业班级:信计1201班2014年12月07日目录实验二几何变换实验三二维基本图形生成的算法实现实验四二维填充图的生成算法实验五曲线的生成算法实现实验二几何变换一、实验目的和要求:进一步掌握理解二维、三维变换的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用TurboC实现二维,三维图形的基本变换和复合变换。
二、实验内容:(1)理解采用齐次坐标进行图形变换的必要性—变换的连续性,使复合变换得以实现。
(2)掌握二维,三维图形基本变换(平移、缩放、对称、旋转、错切)的原理及数学公式。
(3)利用TurboC实现二维、三维图形的基本变换、复合变换(可根据喜好重点实现其中一种变换或全部变换),在屏幕上显示变换过程或变换结果。
三、实验步骤:(1)预习教材关于二维、三维图形变换的原理和算法。
(2)使用TurboC实现某一种或几种基本变换。
(3)调试、编辑、运行程序。
四、实验要求:在下次实验时提交本次实验的实验报告(实验报告包括实验目的、实验内容、实验实现过程、源程序、实验结果、实验体会)。
五、实验结果分析:(1)本实验的主要目的是掌握二维、三维图形基本变换(平移、缩放、对称、旋转、错切)的变换原理及数学公式,利用TurboC实现二维、三维图形的基本变换和复合变换,并在屏幕上显示变换过程或变换结果。
源程序分别实现了对二维图形(直线)进行的平移变换—以及相对于立方体中心的比例变换—复合变换,其余变换类型可自行尝试编辑实现。
(2)实现代码/*二维图形(直线)平移变换/#include<stdio.h>#include<graphics.h>#include<conio.h>int initjuzhen(m)int m[3][3];{ int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)m[i][j]=0;for(i=0;i<3;i++)m[i][i]=1;}main(){ int x0,y0,x1,y1,i,j;Int a[3][3];char key;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode,””);cleardevice();x0=250;y0=120;x1=350;y1=220;line(x0,y0,x1,y1);for(;;){ outtextxy(100,400,”<-:left->right^:up v:down Esc ->exit”); key=getch();initjuzhen();switch(key){case 75:a[2][0]=-10;break;case 77:a[2][0]=10;break;case 72:a[2][1]=-10;break;case 80:a[2][1]=10;break;case27:exit();break;}x0=x0*a[0][0]+y0+a[1][0]+a[2][0];y0=x0*a[0][1]+y0*a[1][1]+a[2][1];x1=x1*a[0][0]+y1*a[1][0]+a[2][0];y1=x1*a[0][1]+y1*a[1][1]+a[2][1];clearviewport()line(x0,y0,x1,y1);}closegraph();}*三维图形(立方体)旋转变换、比例变换*/#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:rotationy(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,10);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," ");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();}六、实验总结:对图形的几何信息经过几何变换产生新的图形。