《1557.计算机图形学课程设计课程设计》由会员分享,可在线阅读,更多相关《1557.计算机图形学课程设计课程设计(12页珍藏版)》请在金锄头文库上搜索。
1、 计算机图形学课程设计学 院:计算机科学学院 班 级: 学 号: 学生姓名: 指导教师: 2008年1月设计一一、课题说明用所学算法编写实现图形比例,移动,旋转变换的程序二、概要设计Sx 0 00 Sy 00 0 1比例变换矩阵: 1 0 00 1 0Tx Ty 1 移动变换矩阵:cos(a) sin(a) 0-sin(a) cos(a) 00 0 1 旋转变换矩阵: 由于在640*480默认的显示模式下,原点(0,0)坐标在屏幕的左上角,左上角向右下角走,x值增大,左上角向右上角走,y值增大。为了便于显示与理解,把原点定在(320,240)点。则移动变换与旋转变换的矩阵就会改变。1 0 00
2、 1 0Tx - Ty 1移动变换矩阵: 旋转变换后,x坐标变为:320+(x-320)*cos(a)-(240-y)*sin(a); y坐标变为:240-(x-320)*sin(a)-(240-y)*cos(a)本程序通过一个三角形比例,移动,旋转变换演示比例,移动,旋转后的结果。首先画出需要变换的三角形(通过给出三角形的三个顶点画出三角形),对三个三角形的顶点变换实现比例,移动,旋转变换操作。三、源程序及注释#include #include /*加入c图形库*/#include yidong(int dx,int dy)/*实现移动函数*/moveto(320+dx,240-dy); l
3、ineto(420+dx,120-dy); lineto(450+dx,140-dy); lineto(320+dx,240-dy);/*变换三角形三个点的坐标实现移动变换*/bilie(float Sx,float Sy) /*实现比例函数*/moveto(320*Sx,240*Sy);lineto(420*Sx,120*Sy); lineto(450*Sx,140*Sy); lineto(320*Sx,240*Sy); /*变换三角形三个点的坐标实现比列变换*/xuanzhuan(float a) /*实现旋转函数*/float p;moveto(320,240);lineto(320+(
4、420-320)*cos(a)-(240-120)*sin(a),240-(420-320)*sin(a)-(240-120)*cos(a);lineto(320+(450-320)*cos(a)-(240-140)*sin(a),240-(450-320)*sin(a)-(240-140)*cos(a); lineto(320,240); /*变换三角形三个点的坐标实现旋转变换*/main() int i,j;float X,Y,bx,by,a;int gdriver=DETECT,gmode; /*初始化显示模式参数*/ initgraph(&gdriver,&gmode,); /*初始化
5、显示为默认的640*480、16色模式 */ i=20; j=240; moveto(i,j); for(i=20;i=620;i+=20) /*使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j); moveto(320,240); lineto(420,120); lineto(450,140); lineto(320,240);/*画出需变换的三角形,其三个顶点分别为(320,240); (420,12
6、0) ;(450,140)*/ printf(please input X,Y to move:); scanf(%f%f,&X,&Y); /*输入移动量 */ yidong(X,Y); printf(please input bx,by to scale:); scanf(%f%f,&bx,&by); /*输入x方向,y方向缩放大小 */ bilie(bx,by); printf(please input a to circumgyrate:); scanf(%f,&a); /*输入旋转角度,a为正,则逆时针旋转*/ xuanzhuan(a); 四、运行结果x轴方向上缩小0.5倍后的三角形旋
7、转45o后的三角形移动(40,40)后的三角形原始三角形设计二一、课题说明编写一个AutoLISP程序,其功能是:画一个轴衬的两个视图,如图4所示。程序应提示用户输入衬套的起始点P0、长度L1、L2和直径ID、OD、HD。主视图与侧视图间的距离DIS为DIS=1.25*HD。程序应分别在HID层和CEN层画出虚线和中心线。中心线需延伸出对象线0.75个单位。 图4 轴衬的两个视图二、概要设计轴衬的两个视图可通过画线函数lineto()、画虚线xuxian()函数(自定义)、画圆函数Bres_Circle()(自定义函数)、画虚圆函数Bres_Circle1()(自定义)实现。1、虚线函数xux
8、ian()通过隔一段距离画一条直线实现 2、画圆函数Bres_Circle()使用Bresenham画圆算法3、画虚圆算法Bres_Circle1()中通过在Bresenham画圆时省去部分点来实现画虚圆三、源程序及注释#include #include /*加入c图形库*/#include int xuxian(int x,int y,int endx)/*实现画虚线函数*/ while(x=endx) moveto(x,y); x+=8; lineto(x,y); x+=5; lineto(endx,y); return(0);int zhxinxian(int x0,int y0, in
9、t endx)/*实现画点划线函数*/moveto(x0-30,y0); x0+=40; lineto(x0,y0);while(x0=endx) x0+=8; moveto(x0,y0); x0+=8; lineto(x0,y0); x0+=8; moveto(x0,y0); x0+=80; lineto(x0,y0); lineto(endx,y0);return(0);int Bres_Circle(int x0,int y0,double r,int color) /*Bresenham画圆函数*/ int x,y,d; x=0; y=(int)r; d=(int)(3-2*r);/*
10、递推公式初始值*/ while(xy) CirPot(x0,y0,x,y,color); if(d0) d+=4*x+6; /*递推公式d=0,迭代d=d+4*(x-y)+10*/ y-; x+; if(x=y)CirPot(x0,y0,x,y,color);return(0);int Bres_Circle1(int x0,int y0,double r,int color) /*实现画虚圆函数*/ int x,y,d,i,j,iTag; j=0; i=0; x=0; y=(int)r; d=(int)(3-2*r); while(xy)j+;if(i=0)iTag=0;if(iTag=0)
11、CirPot(x0,y0,x,y,color);i+;if(i=5)iTag=1;if(iTag=1)i-; if(d0) d+=4*x+6; else d+=4*(x-y)+10; y-; x+; if(x=y) CirPot(x0,y0,x,y,color); printf(j=%d,j);int CirPot(int x0,int y0,int x,int y,int color) int oldcolor; putpixel(x0+x),(y0+y),color); putpixel(x0+y),(y0+x),color); putpixel(x0+y),(y0-x),color);
12、putpixel(x0+x),(y0-y),color); putpixel(x0-x),(y0-y),color); putpixel(x0-y),(y0-x),color); putpixel(x0-y),(y0+x),color);putpixel(x0-x),(y0+y),color); return(0);main() int p0,L1,L2,ID,OD,HD; int gdriver=DETECT,gmode; /*初始化显示模式参数*/int color=15; initgraph(&gdriver,&gmode,); /*初始化显示为默认的640*480、16色模式 */ printf(please input (L1,L2)(as(L1=150,L2=30):); scanf(%d%d,&L1,&L2); printf(please inpu