1557.计算机图形学课程设计课程设计.doc

上传人:仙人指路1688 文档编号:2391294 上传时间:2023-02-17 格式:DOC 页数:12 大小:611.50KB
返回 下载 相关 举报
1557.计算机图形学课程设计课程设计.doc_第1页
第1页 / 共12页
1557.计算机图形学课程设计课程设计.doc_第2页
第2页 / 共12页
1557.计算机图形学课程设计课程设计.doc_第3页
第3页 / 共12页
1557.计算机图形学课程设计课程设计.doc_第4页
第4页 / 共12页
1557.计算机图形学课程设计课程设计.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《1557.计算机图形学课程设计课程设计.doc》由会员分享,可在线阅读,更多相关《1557.计算机图形学课程设计课程设计.doc(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色模式 */ p

13、rintf(please input (L1,L2)(as(L1=150,L2=30):); scanf(%d%d,&L1,&L2); printf(please input (ID,OD,HD)(as(ID=80,OD=150,HD=200):); scanf(%d%d%d,&ID,&OD,&HD); moveto(100,240);/*o*/ lineto(100,240+OD/2);/*a*/ lineto(100+L1-L2,240+OD/2);/*b*/ lineto(100+L1-L2,240+OD/2+(HD-OD);/*c*/ lineto(100+L1,240+OD/2+(H

14、D-OD);/*d*/ lineto(100+L1,240-OD/2-(HD-OD);/*e*/ lineto(100+L1-L2,240-OD/2-(HD-OD);/*f*/ lineto(100+L1-L2,240-OD/2);/*g*/ lineto(100,240-OD/2);/*f*/ lineto(100,240);/*0*/ xuxian(100,240+ID/2,100+L1); xuxian(100,240-ID/2,100+L1); zhxinxian(100,240,100+L1); Bres_Circle(100+L1+1.25*HD,240,ID/2, color);

15、 Bres_Circle(100+L1+1.25*HD,240,HD/2, color);Bres_Circle1(100+L1+1.25*HD,240,OD/2, color); zhxinxian(100+L1+1.25*HD-HD/2,240,100+L1+1.25*HD+HD/2);四、运行结果输入的ID、OD、HD L1、L2分别为80,150,200,150,30时,运行结果如下:设计三一、课题说明编写一个L I S P程序,其功能是绘制如图5所示的梯子。程序在运行时应该提示用户输入梯子的高度(Rise)、宽度(Run)和梯子的阶数n。还需要输入平台的长度L。IHGF图 1 梯子E

16、DCBA二、概要设计通过调用C语言中的库函数lineto()实现画线功能,首先调用moveto()函数起始点移至点A。根据用户输入的的Run和Rise的大小,画出直线AB和直线BC (调用line(xA+Run,yA)与line(xB+Run,yB)实现画AB直线和BC直线),以此类推,画出如图1的梯子。三、源程序及注释#include #include /*加入c图形库*/#include main()int gdriver=DETECT,gmode; /*初始化显示模式参数*/float Rise,Run,L; int n,i;initgraph(&gdriver,&gmode,); /*

17、初始化显示为默认的640*480、16色模式 */ printf(input Rise:); scanf(%f,&Rise); printf(input Run:); scanf(%f,&Run); printf(input L:); scanf(%f,&L); printf(input n:); scanf(%d,&n); /*实现输入高度(Rise)、宽度(Run)、梯子的阶数n与平台的长度L*/ moveto(100,240);/*移至初始点A(100,240)*/for(i=1;i=n-1;i+) lineto(100+i*Run,240-(i-1)*Rise); lineto(100

18、+i*Run,240-i*Rise); /*for循环实现画出ABCDEF线段*/ lineto(100+(i)*Run,240-(i-1)*Rise); /*画出FG线段*/ineto(100+(i)*Run,240+Rise); /*画出线段GH线段*/lineto(100,240+Rise); /*画出线段HI线段*/lineto(100,240); /*画出线段IA线段*/四、运行结果新得体会 通过本次课程设计,我了解到自己还有很多不足,对面向对象语言C+不能熟悉的去运用,而进行图形开发,C+语言是很实用的。本次课程设计运用C语言实现。有很多方面不足,程序比较粗糙,简陋,不具有交换性。若要在图形学方面进一步学习的话,掌握C+面向对象的编程思想进行图形开发是很有必要的。运用C+容易实现交换性,开发出的图形界面友好。在本次课程设计开始初,本是想用C+开发的,但是要运用到MFC模式,编写代码使用这种模式运行试了好久,运行不出结果,最终放弃了运用C+开发,转向了使用C开发。总之,自己的能力还亟待提高,学的还很肤浅,以后需更加努力。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号