25.小型绘图系统_第1页
25.小型绘图系统_第2页
25.小型绘图系统_第3页
25.小型绘图系统_第4页
25.小型绘图系统_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河南理工大学 计算机科学与技术学院 课程设计报告 2008 2009 学年第 二 学期 课程名称 计算机图形学 设计题目 小型绘图系统 学生姓名 任 小 明 学 号 310609010217 专业班级 计算机 06 2 班 指导教师 徐 文 鹏 2009 年 6 月 23 日 目录目录 1 设计概述设计概述 1 1 1 设计题目 1 1 2 设计要求 1 1 3 设计方案 1 2 软件设计 软件设计 2 2 2 程序流程图 2 2 2 算法流程图 3 3 程序 程序 5 3 2 程序清单 5 3 2 程序运行结果 14 4 程序运行结果分析 程序运行结果分析 15 5 系统不足及改进方案 系统不足及改进方案 15 参考文献参考文献 16 1 1 设计概述设计概述 1 11 1设计题目设计题目 小型绘图系统小型绘图系统 1 21 2设计要求设计要求 内容 1 掌握橡皮筋技术绘制直线 圆 2 掌握图形对象的拾取技术 功能要求 1 实现橡皮筋技术绘制直线与圆 2 设置两种状态 绘图与编辑 编辑状态下实现鼠标左键对直线与圆的拾取 按住鼠标左键可以拖动选择对象使其能平移 1 31 3设计方案设计方案 在设计之前先了解掌握本课题所涉及的两种技术 橡皮筋 橡皮筋 Rubber Band 技术 技术 在平面上确定一条直线一般是先定下起点再定下终点 最后把起点和终点 连成直线 如果要求这条直线能通过平面上某一点或和一已知圆相切 上述方 法便不易做得很准确 所谓橡皮筋技术就是在起点确定后 光标移出去定终点 时 在屏幕上始终显示一条连接起点和光标中心的直线 这条直线随着光标中 心位置的变动而变动 它就像在起点和光标中心之间紧紧地拉着一根橡皮筋 有了这根橡皮筋便比较容易地找到通过一个点或和一个圆相切的直线的位置 橡皮筋技术除了可以用来画直线外 还可以用来画圆和矩形 橡皮筋技术实际上是简易动画的实现 它不断地进行 画 擦 画的过程 即 1 从起点到光标中心点 x y 处画图 2 擦除起点到光标中心点 x y 处图形 3 光标移动到新的位置 x x x y y y 4 转第 1 步 重复这个过程 直到按下确认键为止 拖动 拖动 Drag 技术 技术 拖动就是将形体在空间移动 选择拖动功能后 先在作图区用定位设备拾 取某个要拖动的物体 再按住键移动光标 则这个被拾取的物体将随着光标的 移动而移动 就像光标在拖动物体一样 放开键 物体就固定下来 再移动光 标对这个物体就不起作用了 拖动也用到简易动画技术 拖动过程就是不断地进行画 擦 画的过程 通过对橡皮筋技术与拖动技术的掌握 然后开始设计整个流程 根据老师 所给的设计要求 应该生成一个通过鼠标右键功能菜单可以画圆与直线 并且 对圆与直线进行拖动操作的界面 所以主要步骤应为 1 程序初始化 2 建立画线 画圆算法 定义鼠标右键功能 定义拖动功能 3 进行绘图操作测试 4 运行调试 2 软件设计 软件设计 2 1 程序流程框图程序流程框图 程序开始 初始化 建立画线 画圆算 法 绘制图形 定义鼠标右键功能 定义拖动功能 右键点拖动选择 右 键 点 画 线 右 键 点 画 圆 对 线 拖 动 对 圆 拖 动 结束 右键生成功能菜单 2 2 主要算法流程图 主要算法流程图 Bresenham Circle 算法流程图 N Y N Y x sl 算法流程图 N Y intx y d x y CirPot x0 y0 x y d x0 10 edit edit bm sl e f x height y have square false button GLUT LEFT BUTT ON glutPostRedisplay button GLUT LEFT BUTT ON glutPostRedisplay button GLUT LEFT BUTT ON glBegin GL LINES x2 x0 x glBegin GL LINES inti 0 i r r i i i i Y 3 3 程序清单与运行结果 程序清单与运行结果 3 1 程序清单程序清单 include stdafx h include include include include include int 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 square 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 glVertex2f x0 y y0 x Multiplex Multiplex 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 else return false void mouse int button int state int x int y 定义鼠标功能 if Line if button GLUT LEFT BUTTON glEnable GL LOGIC OP if edit b1 b0 height y glColor3f 0 0 1 0 0 0 glLogicOp GL XOR first 0 if button GLUT LEFT BUTTON glFlush glColor3f 0 0 0 0 1 0 glLogicOp GL COPY glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 e e a1 a0 f f b1 b0 glEnd glFlush bm false else if have square false if button GLUT LEFT BUTTON y2 y0 height y glColor3f 0 0 1 0 0 0 glLogicOp GL XOR first 0 if button GLUT LEFT BUTTON glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush x2 x y2 height y glFlush glColor3f 0 0 0 0 1 0 glLogicOp GL COPY glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 e x2 x0 2 f y2 y0 2 glEnd glFlush have square true else if button GLUT RIGHT BUTTON glutPostRedisplay first 0 if Circle if button GLUT LEFT BUTTON glEnable GL LOGIC OP if edit b1 b0 height y glColor3f 0 0 1 0 0 0 glLogicOp GL XOR first 0 if button GLUT LEFT BUTTON glFlush glColor3f 0 0 0 0 1 0 glLogicOp GL COPY glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 e e a1 a0 f f b1 b0 glEnd glFlush bm false else if have square false if button GLUT LEFT BUTTON y2 y0 height y glColor3f 0 0 1 0 0 0 glLogicOp GL XOR first 0 if button GLUT LEFT BUTTON glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush x2 x y2 height y r x2 x0 x2 x0 y2 y0 y2 y0 for int i 0 i r r i i i i glColor3f 0 0 0 0 1 0 glLogicOp GL COPY Bresenham Circle x0 y0 r e x0 f y0 glEnd glFlush have square true else if button GLUT RIGHT BUTTON glutPostRedisplay first 0 void move int x int y 定义移动功能 对直线的移动 if Line if edit glutPostRedisplay glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush a a1 a0 b b1 b0 a1 x b1 height y glTranslatef a1 a0 a b1 b0 b 0 glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush glutPostRedisplay first 1 else if have square true return if first 1 glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush x2 x y2 height y glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush first 1 对圆的移动 if Circle if edit glutPostRedisplay Bresenham Circle x0 y0 r glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush a a1 a0 b b1 b0 a1 x b1 height y glTranslatef a1 a0 a b1 b0 b 0 Bresenham Circle x0 y0 r glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd glFlush glutPostRedisplay first 1 else if have square true return if first 1 glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd r x2 x0 x2 x0 y2 y0 y2 y0 for int i 0 i r r i i i i Bresenham Circle x0 y0 r glFlush x2 x y2 height y glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 glEnd r x2 x0 x2 x0 y2 y0 y2 y0 for int i 0 i r r i i i i Bresenham Circle x0 y0 r glFlush first 1 void display void 对 display 函数申明 glEnable GL COLOR LOGIC OP glClear GL COLOR BUFFER BIT glClearColor 1 0 1 0 1 0 1 0 glMatrixMode GL MODELVIEW glLoadIdentity if Circle glTranslatef a1 a0 c b1 b0 d 0 glColor3f 0 0 0 0 1 0 glLogicOp GL COPY Bresenham Circle x0 y0 r c c a1 a0 d d b1 b0 if Line glTranslatef a1 a0 c b1 b0 d 0 glBegin GL LINES glVertex2f x0 y0 glVertex2f x2 y2 c c a1 a0 d d b1 b0 glEnd glFlush void myReshape int w int h 定义绘制物体时使用的坐标系 glClearColor 1 0 1 0 1 0 1 0 glViewport 0 0 w h width w height h glMatrixMode GL PROJECTION glLoadIdentity if w h gluOrtho2D 0 0 500 0 0 0 GLfloat h GLfloat w 500 0 else gluOrtho2D 0 0 GLfloat w GLfloat h 500 0 0 0 500 0 gluOrtho2D 0 0 GLfloat w 0 0 GLfloat h glMatrixMode GL MODELVIEW void processMenuEvents int option 定义菜单事件 switch option case 1 x0 0 y0 0 x2 0 y2 0 a0 0 b0 0 a1 0 b1 0 a 0 b 0 c 0 d 0 e 0 f 0 have square false edit false bm false Line false Circle false 直线不显示 圆也不显示 r 0 Line true Circle false 直线显示 圆不显示 glutPostRedisplay break case 2 edit true first 0 break case 3 x0 0 y0 0 x2 0 y2 0 a0 0 b0 0 a1 0 b1 0 a 0 b 0 c 0 d 0 e 0 f 0 have square false edit false bm false Line false Circle false 直线不显示 圆也不显示 r 0 Line false Circle true 直线不显示 圆显示 glutPostRedisplay break void createGLUTMenus 创建弹出式菜单 int menu 创建菜单并告诉 GLUT processMenuEvents 处理菜单事件 menu glutCreateMenu processMenuEvents 给菜单增加条目 glutAddMenuEntry 画线 1 glutAddMenuEntry 拖动选择 2 glutAddMenuEntry 画圆 3 把菜单和鼠标右键关联起来 glutAttachMenu GLUT RIGHT BUTTON void main int argc char argv 主函数 glutInit glutInitDisplayMode GLUT SINGLE GLUT RGB 使用双缓存模式和深度缓存 glutInitWindowSize 500 500 glutInitWindowPosition 0 0 glutCreateWindow Sierpinski glutReshapeFunc myReshape glutDisplayFunc display 显示函数 createGLUTMenus 调用菜单函数 glutMotionFunc move glutMouseFunc mouse glutMainLoop 3 2 程序运行结果程序运行结果 运行结果运行结果 在 C 环境下运行程序 会出现一个绘图界面 点击右键有三 个选项 分别为 画线 拖动选择 画圆 点击 画线 可以在背景白布上 画直线 然后点 拖动选择 可以对所画的直线进行拾取 按住鼠标左键可以 拖动选择对象使其能平移 同理点 画圆 可以画圆 用 拖动选择 功能 进行拾取 移动 演示结果 1 画线 2 对线进行拖动 3 画圆 4 对圆进行拖动 4 设计总结分析 设计总结分析 通过一周的学习与设计 我学到了很多 不仅是图形学

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论