CADCAM课程设计图形变换程序设计
- 格式:doc
- 大小:43.50 KB
- 文档页数:5
实验一实验要求:用任一种高级语言编写出3~4种常用的二维、三维图形基本变换程序。
要求在报告中写出具体的调试过程,并附上源程序。
实验说明:本实验用C语言进行编程。
程序功能说明:本程序为一个综合型程序:能实现二维和三维的图形的各种变换。
例如,可以进行二维(或三维)图形的比例,平移,对称,旋转,错切五种变换。
程序预设图形顶点个数最多不超过50个,如果需要扩大顶点数目,直接在程序开头的N值进行赋值。
在进行旋转变换时,预设圆周率为M值,如果需修改时,直接对程序开头的M值进行修改。
程序功能的原理是通过变换基本矩阵,实现对顶点不同的变换,从而实现对图形的变换。
调试说明:1:首先把源程序家加载到Visual C++6.0中。
然后进行编译,组建,最后执行。
2:按照执行过程中的提示一步一步进行操作,最后输出结果。
具体步骤:1:输入图形是几维图形。
(二维或三维)2:输入顶点个数(小于50),然后输入各点坐标,注意输完一个坐标后回车后输入下一个坐标。
3:输入变换类型,根据提示输入代表类型的数字。
接下来输入相关变换所需要的参数。
4:待各个参数输入完毕后,回车后得到结果。
程序实例:对一个三维的六方体图形进行绕x轴旋转45度变换。
具体操作:(1)输入维数为3;(2)输入顶点数为6;(3)输入各个坐标:(0,0,0),(0,1,0),(1,0,0),(0,0,1),(0,1,1)(1,1,1)。
(4)输入变换模式:此例是旋转,输入5;(5)输入旋转轴,此处输入1;(6)输入旋转度数:45。
最后回车得到结果。
运算结果如下图:源程序如下:#include <stdio.h>#include <math.h>#define N 50#define M 3.14159265void erwei();void sanwei();void main(){ int w;printf("请输入是几维图形变换:二维(2)或三维(3): ");scanf("%d",&w);if (w==2) erwei();elseif (w==3) sanwei();}void erwei(){ float a[3][3]={{1,0,0},{0,1,0},{0,0,1}};int ii,k,h;float b[N][2];printf("请输入图形定点个数 : ");scanf("%d",&k);printf("请输入顶点坐标:\n");for (ii=0;ii<k;ii++)scanf("%f,%f",&b[ii][0],&b[ii][1]);printf("请输入变换模式:比例(1),对称(2),错切(3),平移(4),旋转(5): "); scanf("%d",&h);if (h==1){int m,n;printf("请输入比例因子(x,y): ");scanf("%d,%d",&m,&n);a[0][0]=m;a[1][1]=n;}elseif (h==2){int ch;printf("请输入对称轴:x(1)或y(2): ");scanf("%d",&ch);if (ch==1) a[1][1]=-1;if (ch==2) a[0][0]=-1;}elseif (h==3){ int r; float f;printf("请输入错切轴x(1)或y(2)和错切因子a(b): ");scanf("%d,%f",&r,&f);if (r==1) a[1][0]=f;if (r==2) a[0][1]=f;}elseif (h==4){float i,j;printf("请输入平移坐标(x,y): ");scanf("%f,%f",&i,&j);a[2][0]=i;a[2][1]=j;}elseif (h==5){float g;printf("请输入旋转角度(度): ");scanf("%f",&g); g=M*g/180;a[0][0]=cos(g);a[0][1]=sin(g);a[1][0]=-sin(g);a[1][1]=cos(g);}printf("经过变换后的坐标为:\n");for (ii=0;ii<k;ii++)printf("%.2f,%.2f\n",b[ii][0]*a[0][0]+b[ii][1]*a[1][0]+a[2][0],b[ii][0]*a[0][1] +b[ii][1]*a[1][1]+a[2][1]);}void sanwei(){float a[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};float c[N][3],x1,y1,z1;int h,q,jj;printf("请输入三维图形的顶点个数: ");scanf("%d",&q);printf("请输入顶点坐标: \n");for(jj=0;jj<q;jj++)scanf("%f,%f,%f",&c[jj][0],&c[jj][1],&c[jj][2]);printf("请输入变换模式:比例(1),对称(2),错切(3),平移(4),旋转(5): "); scanf("%d",&h);if (h==1){int l,m,n;printf("请输入比例因子(x,y,z): ");scanf("%d,%d,%d",&l,&m,&n);a[0][0]=l;a[1][1]=m;a[2][2]=n;}elseif (h==2){int ch;printf("请输入对称面:xy(1),yz(2),zx(3): ");scanf("%d",&ch);if (ch==1) a[2][2]=-1;if (ch==2) a[0][0]=-1;if (ch==3) a[1][1]=-1;}elseif (h==3){int str; float o,p;printf("请输入错切面:xy(1),yz(2),zx(3): ");scanf ("%d",&str);printf("请输入错切因子(a,b): ");scanf("%f,%f",&o,&p);if (str==1) {a[1][0]=o;a[2][0]=p;a[0][1]=o;a[2][1]=p;}if (str==2) {a[0][1]=o;a[2][1]=p;a[0][2]=o;a[1][2]=p;}if (str==3) {a[1][0]=o;a[2][0]=p;a[0][2]=o;a[1][2]=p;}}elseif (h==4){float r,s,t;printf("请输入平移坐标(x,y,z): ");scanf("%f,%f,%f",&r,&s,&t);a[3][0]=r;a[3][1]=s;a[3][2]=t;}elseif (h==5){int e;float du;printf("请输入旋转轴,x轴(1),y轴(2),z轴(3): ");scanf("%d",&e);printf("请输入旋转角度(度): ");scanf("%f",&du); du=M*du/180;if(e==1){a[1][1]=cos(du);a[2][1]=-sin(du);a[1][2]=sin(du);a[2][2]=cos(du);} if(e==2){a[0][0]=cos(du);a[2][0]=-sin(du);a[0][2]=sin(du);a[2][2]=cos(du);} if(e==3){a[0][0]=cos(du);a[1][0]=-sin(du);a[0][1]=sin(du);a[1][1]=cos(du);} }printf("经变换后坐标为:\n");for (jj=0;jj<q;jj++){x1=c[jj][0]*a[0][0]+c[jj][1]*a[1][0]+c[jj][2]*a[2][0]+a[3][0];y1=c[jj][0]*a[0][1]+c[jj][1]*a[1][1]+c[jj][2]*a[2][1]+a[3][1];z1=c[jj][0]*a[0][2]+c[jj][1]*a[1][2]+c[jj][2]*a[2][2]+a[3][2];printf("%.2f,%.2f,%.2f\n",x1,y1,z1);}}。