《25.小型绘图系统.doc》由会员分享,可在线阅读,更多相关《25.小型绘图系统.doc(18页珍藏版)》请在金锄头文库上搜索。
1、河南理工大学计算机科学与技术学院课程设计报告2008 2009学年第 二 学期课程名称 计算机图形学 设计题目 小型绘图系统 学生姓名 任 小 明 学 号 310609010217 专业班级 计算机06-2班 指导教师 徐 文 鹏 2009年6月23日目录1、设计概述11.1设计题目.11.2设计要求.11.3设计方案.12、软件设计.22.2程序流程图.22.2算法流程图.33、程序.53.2程序清单.53.2程序运行结果.144、程序运行结果分析.155、系统不足及改进方案.15参考文献.161.设计概述1.1设计题目小型绘图系统1.2设计要求内容:(1)掌握橡皮筋技术绘制直线、圆;(2)
2、掌握图形对象的拾取技术;功能要求:(1)实现橡皮筋技术绘制直线与圆;(2)设置两种状态:绘图与编辑。编辑状态下实现鼠标左键对直线与圆的拾取,按住鼠标左键可以拖动选择对象使其能平移;1.3设计方案在设计之前先了解掌握本课题所涉及的两种技术:l 橡皮筋(Rubber Band)技术在平面上确定一条直线一般是先定下起点再定下终点,最后把起点和终点连成直线。如果要求这条直线能通过平面上某一点或和一已知圆相切,上述方法便不易做得很准确。所谓橡皮筋技术就是在起点确定后,光标移出去定终点时,在屏幕上始终显示一条连接起点和光标中心的直线,这条直线随着光标中心位置的变动而变动,它就像在起点和光标中心之间紧紧地拉
3、着一根橡皮筋,有了这根橡皮筋便比较容易地找到通过一个点或和一个圆相切的直线的位置。橡皮筋技术除了可以用来画直线外,还可以用来画圆和矩形。橡皮筋技术实际上是简易动画的实现,它不断地进行:画擦画的过程。即:(1)从起点到光标中心点(x,y)处画图;(2)擦除起点到光标中心点(x,y)处图形;(3)光标移动到新的位置:x=x+x,y=y+y(4)转第(1)步,重复这个过程,直到按下确认键为止。l 拖动(Drag)技术拖动就是将形体在空间移动。选择拖动功能后,先在作图区用定位设备拾取某个要拖动的物体,再按住键移动光标,则这个被拾取的物体将随着光标的移动而移动,就像光标在拖动物体一样,放开键,物体就固定
4、下来,再移动光标对这个物体就不起作用了。拖动也用到简易动画技术,拖动过程就是不断地进行画、擦、画的过程。通过对橡皮筋技术与拖动技术的掌握,然后开始设计整个流程。根据老师所给的设计要求,应该生成一个通过鼠标右键功能菜单可以画圆与直线,并且对圆与直线进行拖动操作的界面,所以主要步骤应为:(1)程序初始化(2)建立画线、画圆算法,定义鼠标右键功能,定义拖动功能(3)进行绘图操作测试(4)运行调试2软件设计2.1程序流程框图程序开始绘制图形右键点画圆右键点画线初始化建立画线、画圆算法右键点拖动选择定义鼠标右键功能对圆拖动对线拖动定义拖动功能右键生成功能菜单结束2.2主要算法流程图:Bresenham_
5、Circle算法流程图intx,y,d;x=y NYCirPot(x0,y0,x,y);d(x0-10)&(x(y0-10)&(y=rglColor3f(0.0,0.0,1.0);i+i=rinti=0glBegin(GL_LINES);x2=x0=x;glBegin(GL_LINES);x2=x0=x;button=GLUT_LEFT_BUTTON&state=GLUT_UPbutton=GLUT_LEFT_BUTTON&state=GLUT_DOWNglutPostRedisplay();a1=a0=x;button=GLUT_LEFT_BUTTON&state=GLUT_UPbutton
6、=GLUT_LEFT_BUTTON&state=GLUT_DOWNa1=a0=x;button=GLUT_LEFT_BUTTON&state=GLUT_UPbutton=GLUT_LEFT_BUTTON&state=GLUT_UPbutton=GLUT_LEFT_BUTTON&state=GLUT_DOWNhave_square=falsebm=sl(e,f,x,height-y);bm=sl(e,f,x,height-y);edit&bmglEnable(GL_LOGIC_OP);edit&bmglEnable(GL_LOGIC_OP);button=GLUT_LEFT_BUTTON&sta
7、te=GLUT_DOWNbutton=GLUT_LEFT_BUTTON&state=GLUT_DOWNCircleLine N Y N Y N Y N NY NYglutPostRedisplay();NYNYNYYMultiplexMultiplex3、程序清单与运行结果3.1程序清单#include stdafx.h#include#include#include#include#includeint x0,y0;int x2,y2;int a0,b0,a1,b1,a,b,c,d,e,f;int width;int height=500;int first=500;bool have_sq
8、uare=false;bool edit=false,bm=false;bool Line=false,Circle=false;int r; /对称得到整个圆void display(void);void CirPot(int x0,int y0,int x,int y) glBegin(GL_POINTS); glVertex2f(x0+x,y0+y); glVertex2f(x0+x,y0-y); glVertex2f(x0-x,y0+y); glVertex2f(x0-x,y0-y); glVertex2f(x0+y,y0+x); glVertex2f(x0+y,y0-x); glVe
9、rtex2f(x0-y,y0+x); glVertex2f(x0-y,y0-x);glEnd();/Bresenham法画圆void Bresenham_Circle(int x0,int y0,int radius) int x,y,d; x=0; y=int(radius); d=(int)3-2*radius; while (x=y) CirPot(x0,y0,x,y); if (d(x0-10)&(x(y0-10)&(y(y0+10)return true;else return false;void mouse(int button,int state, int x,int y) /定义鼠标功能 if(Line)