




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2014计算机图形学课程设计课程设计I 金刚石图案算法知识要点l 自定义二维坐标系。l 二维点类的定义方法。l 对话框的创建及调用方法。l 金刚石图案算法。l 一维堆内存的分配与释放。l 设计个性化的菜单项与工具栏。l 创建Test工程模板。一、案例需求1案例描述将半径为r的圆周n等份,然后用直线段将每一个等分点和其他所有等分点连接,形成的图案称为金刚石图案。使用对话框读入等分点个数与圆的半径,以屏幕客户区中心为圆心,请使用MFC的基本绘图函数绘制蓝色直线段构成的金刚石图案。2功能说明(1)程序运行界面提供“文件”、“图形”和“帮助”3个弹出菜单项。“文件”菜单项提供“退出”子菜单,用于退出工程;“图形”菜单项提供“绘图”子菜单,用于绘制金刚石图案;“帮助”菜单项提供“关于”子菜单,用于显示开发信息。(2)工具栏提供与子菜单项“退出”、“绘图”、“关于”相对应的图标按钮。(3)单击 “绘图”子菜单或“绘图”图标按钮,弹出图1-1(a)所示的输入对话框,读入圆的等分点个数和圆的半径,单击输入对话框的OK按钮绘制金刚石图案。(4)自定义屏幕二维坐标系,原点位于客户区中心,x轴水平向右为正,y轴垂直向上为正。以二维坐标系原点为圆心绘制半径为r的圆,将圆的n等分点使用直线段彼此连接形成金刚石图案,如图1-1(b)所示。3案例效果图 案例的输入对话框和绘制效果如图1-1所示。 (a)输入对话框 (b)金刚石图案图1-1输入对话框及效果图二、案例分析本案例设计的目的是使用Visual C+的MFC开发平台来建立一个Test工程,为后续的案例设计提供一个通用的工程模板。Test工程包含了菜单设计、工具栏图标按钮设计、输入对话框设计和关于对话框设计等任务。在建立Test工程模板的基础上,本案例以绘制金刚石图案为例,讲解二维点类CP2的设计方法和CTestView类的修改方法。1 菜单和工具栏按钮根据案例的功能要求,需要在MFC环境中建立一个由“文件”、“图形”和“帮助”3个菜单项组成的弹出菜单,其中“文件”菜单项的子菜单为“退出”,用于退出Test工程,如图1-2所示;“图形”菜单项的子菜单为“绘图”,用于调用输入对话框绘制金刚石图案,如图1-3所示;“帮助”菜单项的子菜单为“关于”,用于显示开发人员信息,如图1-4所示。工具栏上的图标按钮代表“退出”子菜单、图标按钮代表“绘图”子菜单,图标按钮代表“关于”子菜单。关联图标按钮与菜单项的方法是让二者具有相同的ID号。由于标题栏图标的大小为1616,Debug文件夹内的图标的大小为3232,本案例将系统标题栏默认图标修改为,将Debug文件夹内的默认图标修改为。 图1-2 “退出”子菜单 图1-3 “绘图”子菜单图1-4 “关于”子菜单2 对话框(1)定义输入对话框类CInputDlg,输入 “等分点个数”和“圆的半径”两个参数,如图1-1(a)所示。(2)新关于对话框是在Test工程提供的原关于对话框的基础上修改而成,如图1-5所示。 (a)原“关于”对话框 (b)新“关于”对话框图1-5 “关于”对话框3 二维点类图形是由像素点组成的,像素点的绘制使用的是整数坐标。在图形的设计过程中,为了保证计算精度,使用了双精度数,将计算结果输出到屏幕时,需要将双精度数值转换为整数值。P1本案例定义了二维坐标点类CP2(在Visual C+中,常用大写字母C开始的标识符作为类名),用于对各个点的double型坐标(x,y)进行整体处理,如图1-6所示。P4P3P2P0 图1-6 二维点类类图 图1-7 n5时的线段连接类图1-6中,“+”代表公有成员(“-”代表私有成员,“#”代表保护成员)。虽然一般在类的设计中常将成员变量设置为私有成员,但二维点类中的(x,y)主要用于类外赋值,因此CP2类使用了公有数据成员。4 金刚石图案金刚石图案是每一个顶点都与其它顶点相连的正n边形。金刚石图案有时被用做计算机图形设备的测试图案,其有序的形状可以揭示任何扭曲。通过观察交汇于每个顶点的直线所呈现出来的拥挤和模糊程度,可以确定设备的分辨率。本案例设计的技巧是使用线段连接每个顶点时不进行重复连接。例如当圆的等分点个数n5时,只连接5段直线。线段的连接情况如图1-7所示,线段端点见表1-1。表1-1线段连接方式起点终点P0P1,P2,P3,P4P1P2,P3,P4P2P3,P4P3P45 一维堆内存圆的等分点个数是输入值,需要定义动态对象数组保存等分点坐标,以实现绘制任意等分点个数的金刚石图案。本案例定义了CP2类的一维对象数组指针P。使用动态对象数组,可以避免静态数组的“大开小用”的弊端。动态数组在堆区中分配,动态数组的大小只有在程序运行时才能确定,这样编译器在编译时就无法为它们预留内存空间,在程序运行时才根据输入值进行内存分配,这种方法称为动态内存分配。Visual C+中一维动态数组分配的格式为指针变量名=new 类型名下标表达式;new运算符返回的是一个指向所分配类型数组的指针,动态创建的数组本身没有名字。使用new运算符创建数组时只能调用类的默认构造函数。如果类内定义了一个带参构造函数,Visual C+将不再提供默认构造函数,这时需要显式定义默认构造函数。使用new运算符的最大问题是容易造成内存泄漏。为了避免内存泄漏,需要使用delete运算符来释放由new运算符所分配的堆空间。Visual C+中动态数组释放的格式为delete 指向该数组的指针变量名;数组分配格式和数组释放格式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,编译器认为该指针是指向数组第一个元素的指针,只回收了第一个元素所占内存空间,产生回收不彻底的问题。加了方括号后就转化为指向数组的指针,回收了整个数组。delete 的方括号中不需要填数组元素数,由系统自己确定。即便写了,编译器也会忽略。三、算法设计(1)读入圆的等分点个数n与圆的半径r。(2)根据等分点个数计算金刚石图案的等分角。(3)计算金刚石图案的起始角。是用于调整金刚石图案的起始位置,调整情况如图1-8所示。 (a)=0 (b)图1-8 调整金刚石图案的方位(4)将圆等分后的顶点坐标存储于数组P中。(5)设计一个二重循环,代表起点的外层整型变量i从i=0循环到i=n-2;代表终点的内层整型变量j从j=i+1循环到j=n-1。以pi为起点,以pj为终点连接各线段构成金刚石图案。四、案例设计1. 设计Test工程模板微软基类库(microsoft foundation class library,MFC)是以C+形式封装的Windows API(application program interface),包含了200多个已经定义好的常用类。MFC向导(MFC AppWizard(exe))生成了一个应用程序框架,通过添加或修改框架代码可以完成具体设计任务。作为上机操作的基础,首先讲解创建基于MFC的Test工程模板的步骤。(1)在图1-9所示的Visual C+集成开发环境中,选择File|New命令,弹出New对话框,切换到Projects选项卡。在左边窗口中选择MFC AppWizard(exe),在右边的Project name文本框中输入工程名,这里输入Test,在Location文本框中出现用于存放工程的目录,这里设置为D:Test。其余保持默认值。如图1-10所示。单击OK按钮。 图1-9 Visual C+集成开发环境 图1-10 New 对话框 (2)在MFC AppWizard-Step1对话框中,选中Single Document单选按钮,其余保持默认值,如图1-11所示。单击Finish按钮结束。(3)弹出New Project Information对话框,如图1-12所示,应用程序向导创建了应用类CTestApp,框架类CMainFrame,文档类CTestDoc和视图类CTestView。单击OK按钮。 图1-11 MFC AppWizard-Step1 对话框 图1-12 New Project Information 对话框(4)完成上述步骤后,应用程序Test的MFC框架即已生成,出现程序工作区。如图1-13所示。图1-13 应用程序的MFC框架在工作区的ClassView标签页中显示MFC AppWizard(exe)所创建的类,主要包括CAboutDlg、CMainFrame、CTestApp、CTestDoc和CTestView等类,如图1-14所示。在Resource View标签页中显示所创建的资源,主要包括Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version等资源,如图1-15所示。在FileView标签页中显示源程序文件,主要包括Source Files、Head Files和Resource Files等文件,如图1-16所示。 图1-14 ClassView标签页 图1-15 ResourceView标签页 图1-16 FileView标签页 从ClassView标签页可以看出,CTestApp是应用的主函数类,是应用程序的入口。MFC中的数据是存储在CTestDoc类文档中,而结果的显示则是在CTestView类中,即显示在CMainFrame类的客户区中。MFC中的Doc/View结构用来将程序的数据本身与数据显示相互隔离,CTestDoc类的Serialize()函数负责管理数据,CTestView类的OnDraw()函数用于显示数据。全部展开FileView标签页后,显示如图1-17所示的内容。图1-17 FileView标签页全部展开显示(5)单击图1-18所示工具栏上的按钮,就可以直接编译、连接和运行程序。Test工程运行结果如图1-19所示。至此,尽管未编写一句代码,但Test工程已经生成了一个可执行的应用程序框架。后续的工作就是针对具体的设计任务,为该框架添加程序代码和修改资源文件。 图1-18 执行按钮 图1-19运行结果2. 设计菜单和工具栏按钮设置菜单的ID在资源标签页ResourceView上双击Menu,打开IDR_MAINFRAME,修改菜单项内容,结果如图1-20所示。 图1-20 菜单设计结果设置子菜单“退出”的ID为ID_APP_EXIT,Prompt为“退出应用程序n退出”; “绘图”的ID为IDM_DRAWPIC,Prompt为“绘制图形n绘图”; “关于”的ID为ID_APP_ABOUT,Prompt为“开发人员信息n关于”。如图1-21所示。 图1-21 子菜单属性设计结果(2)设置工具栏按钮在资源视图ResouceView标签页中,选中Icon资源项,右击鼠标,在弹出菜单中选择Import,如图1-22所示,弹出Import Resource对话框如图1-23所示。本案例使用表1-2所示的图标app.ico代表Test应用程序,图标draw.ico代表“绘图”子菜单,图标exit.ico代表“退出”子菜单,图标help.ico代表“关于”子菜单。图标导入结果如图1-24的Icon资源项下的IDI_ICON1IDI_ICON4所示。 图1-22 导入资源菜单选项 图1-23 Import Resource对话框表1-2 图标标识和图标文件的对应关系ID标识图标文件名图标IDI_ICON1app.ico IDI_ICON2draw.ico IDI_ICON3exit.icoIDI_ICON4help.ico双击Toolbar下的IDR_MAINFRAME打开工具栏,将系统提供的默认图标拖动至图标编辑处予以删除。选中空白图标处依次粘贴图标文件IDI_ICON3、IDI_ICON2和IDI_ICON4,结果如图1-25所示。其中第1个图标按钮代表“退出”,第2个图标按钮代表“绘图”,第3个图标按钮代表“关于”。(3)关联工具栏按钮与菜单项双击图1-25所示的图标,弹出Toolbar Button Properties对话框,修改其ID号为子菜单“文件|退出”的ID,即ID_APP_EXIT,如图1-26所示;双击图1-25所示的图标,修改其ID号为子菜单“图形|绘图”的ID,即IDM_DRAWPIC,如图1-27所示;双击图1-25所示的图标,修改其ID号为子菜单“帮助|关于”的ID,即ID_APP_ABOUT,如图1-28所示。 图1-24 导入图标 图1-25 工具栏按钮设计结果 图1-26 设置“退出”按钮ID 图1-27 设置“绘图”按钮ID 图1-28 设置“关于”按钮ID(4)设计应用程序图标双击资源Icon项下的IDR_MAINFRAME标识,打开应用程序默认图标,执行Edit|Clear菜单命令,应用程序默认图标改变为。双击图标标识IDI_ICON1,在右侧图标编辑区打开图标。单击Edit|Copy菜单命令,然后粘贴到应用程序默认图标,成为。这里注意:要在Device选项为Small(1616)和Standard(3232)两种选项下分别进行对应的复制和粘贴,前者修改了标题栏的默认图标,后者修改了Debug文件夹内Test.exe可执行文件的默认图标。3. 设计“关于”对话框执行MFC AppWizard(exe)向导后,系统自动生成了默认的“关于”对话框,如图1-5(a)所示。修改原“关于”对话框,设置能体现开发信息的新“关于”对话框,效果如图1-5(b)所示。在ResouceView标签页中选中Test resources,右击鼠标弹出如图1-29所示快捷菜单,选择Import,打开如图1-30所示的Import Resource对话框,将对话框的文件类型从“Icons(.ico)”修改为“所有文件(*.*)”,选中一幅位图,如about.bmp位图。这时ResouceView标签页中出现了Bitmap选项,修改位图的ID为:IDB_ABOUT,如果该位图为索引颜色,则双击左侧的IDB_ABOUT标识符,可以在右侧的位图编辑器内打开about.bmp位图,如图1-31所示。 图1-29导入资源快捷菜单 图1-30 导入资源对话框 图1-31 位图编辑器 图1-32 打开默认的“关于”对话框在ResouceView标签页的Dialog选项下双击IDD_ABOUTBOX,打开系统默认的“关于”对话框,如图1-32所示。只保留Picture和Button控件,删除其余控件,并调整对话框高度为about.bmp位图的高度(不包含确定按钮的高度),结果如图1-33所示。选中Picture控件,右击鼠标弹出快捷菜单,选择Porperties,打开Picture Properties对话框,如图1-34所示。在Image项内选择IDB_ABOUT,出现如图1-5(b)所示的设计效果。 图1-33 保留“关于”对话框的Picture控件 图1-34 修改Picture控件属性4. 设计输入对话框设计输入对话框界面为了动态读入等分点个数和圆的半径,本案例使用了输入对话框。在ResourceView标签页中选择Dialog,右击鼠标弹出快捷菜单,如图1-35所示,选择Insert Dialog,出现图1-36所示的初始对话框。删除Cancel按钮,并利用图1-37所示的控件箱,分别添加两个静态文本控件Static Text和两个编辑框控件Edit Box,将控件拖到适合的位置。如果控件箱没有出现在开发环境中,可以在工具栏空白处右击鼠标选择Controls使之显示,如图1-38所示。 图1-35 添加话框图 1-36 对话框的初始样式 图1-37 控件箱 图1-38 显示控件箱快捷菜单添加控件后的输入对话框如图1-39所示,下面分别设计各控件的属性。设置第1行的静态文本控件的Caption属性为:“输入等分点个数:”,如图1-40所示。第1行的编辑框控件的ID属性保持为IDC_EDIT1,如图1-41所示。第2行的静态文本控件的Caption属性设置为:“输入圆的半径:”,如图1-42所示。编辑框控件的ID属性保持为IDC_EDIT2,如图1-43所示。设置输入对话框的Caption属性为:“输入参数”,对话框字体修改为“宋体,9号”,使得输入对话框和Windows中的对话框外观保持一致,如图1-44所示。图1-39 添加控件后的输入对话框 图1-40 第1行的Static控件属性设计 图1-41 第1行的Edit控件属性设计 图1-42 第2行的Static控件属性设计 图1-43 第2行的Edit控件属性设计 图1-44 对话框标题设计添加输入对话框类双击输入对话框弹出Adding a Class对话框,如图1-45所示,保持默认选项Creat a new class,单击OK按钮。在弹出的New Class对话框中填写输入对话框类名CInputDlg,如图1-46所示,单击OK按钮,输入对话框类添加完毕。 图1-45 添加对话框类 图1-46 输入对话框类名为输入对话框的控件映射数据成员在Visual C+开发环境中选择View|ClassWizard菜单项,如图1-47所示,弹出MFC ClassWizard对话框,选中Member Variables标签页。为输入对话框添加数据成员的类型与名称。其中,IDC_EDIT1控件在输入对话框内的映射变量名为m_n,类型为int,代表等分点个数,限制其Minimum为5,Maximum为50,设计结果如图1-48所示;IDC_EDIT2控件在输入对话框内的映射变量名为m_r,类型为double,代表圆的半径,限制其Minimum为200.0,Maximum为320.0,如图1-49所示。单击OK按钮完成设计。这里使用了MFC的数据交换(dialog data exchange,DDX)和数据校验(dialog data validation,DDV)技术。DDX是一种用于在对话框的控件和控件的相关变量之间传递数据的方法。DDV是一种用于数据从对话框的控件传递出来时进行检验的方法。 图1-47 ClassWizard菜单 图1-48 添加“等分点个数”编辑框控件的数据成员 图1-49 添加“圆的半径”编辑框控件的数据成员 图1-50 添加消息映射函数 图1-51 添加新类 图1-52 定义二维点类 图1-53 新添加的点类 图1-54“P2.h”与“P2.cpp”文件 5. 设计CTestView类(1)添加“绘图”子菜单命令消息映射函数子菜单“退出”与“关于”的映射函数已经由系统框架提供,这里予以保留。子菜单“绘图”的消息映射函数需要自行添加。选择菜单View|Class Wizard,在Object IDs中选择IDM_DRAWPIC,在Class name中选择CTestView类,在Message中选择COMMAND后,单击Add Function按钮,弹出Add Member Function对话框,保持默认菜单成员函数名OnDrawpic (),单击OK按钮,则在Member function中为“绘图”子菜单项成功添加了命令消息映射函数OnDrawpic()。该函数成为了CTestView类的成员函数,系统已经自动进行了函数声明,添加过程如图1-55所示。单击Edit Code按钮可以对OnDrawpic()函数进行编辑。图1-55 添加“绘图”子菜单命令消息映射函数(2)CTestView类的头文件设计绘制金刚石图案需要增加成员变量与成员函数。定义CP2 类型的指针P成员变量用于存储金刚石的等分点坐标,定义int类型的n成员变量用于读入等分点个数,定义double类型的 r成员变量用于读取圆的半径。定义成员函数Diamond()用于绘制金刚石图案。在ClassView标签页中选中CTestView类,右击鼠标弹出快捷菜单,选择Add Member Variable,如图1-56所示,出现Add Member Variable对话框,如图1-57所示,在Variable Type编辑框中添加金刚石等分点的类型,这里为CP2类型,在Variable Name编辑框中输入顶点指针名字,这里输入*P,成员变量的访问权限控制符选择为Protected。类似地可以按照图1-58添加等分点个数n,按照图1-59添加圆的半径。 图1-56 添加成员变量快捷菜单 图1-57 添加金刚石顶点数组P图1-58 添加等分点个数n 图1-59 添加圆的半径r由于本案例中使用了CP2类定义顶点数组指针P,需要在TestView.h文件头包含CP2类的头文件,语句如下:#include P2.h 图1-60 添加成员函数快捷菜单 图1-61添加金刚石函数在ClassView标签页中选中CTestView类,右击鼠标弹出快捷菜单,选择Add Member Function,如图1-60所示,出现Add Member Function对话框,如图1-61所示,在Function Type编辑框中添加金刚石函数的类型,这里为void,在Function Declaration编辑框中输入金刚石函数的名字,这里输入Diamond,函数的访问权限控制符选择为Public。(3)CTestView类的源文件设计在文件视图标签页FileView的Source Files下找到TestView.cpp文件,双击打开,修改Diamond()成员函数的定义。使用CWnd类的成员函数GetClientRect(&rect) 获取屏幕客户区(不包括菜单栏、工具栏和状态栏的空白区域)坐标,如图1-62所示。然后自定义二维坐标系,坐标系原点位于客户区中心,x轴水平向右为正,y轴垂直向上为正,此时使用GetClientRect()函数所获得的客户区如图1-63所示,可以看出,由于坐标系的改变,客户区已经向屏幕的左上方偏移了(w/2,h/2)。CRect类的成员函数OffsetRect()的作用是在新坐标系内将客户区恢复到原先位置,如图1-64所示,此时客户区的左下角点坐标为(left,top),右上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿克苏市中石化2025秋招笔试模拟题含答案安全环保与HSE岗
- 葫芦岛市中石油2025秋招笔试模拟题含答案财务与审计岗
- 天水市中石化2025秋招笔试模拟题含答案油品分析质检岗
- 安庆市中石化2025秋招面试半结构化模拟题及答案油田勘探开发岗
- 六安市中储粮2025秋招战略研究博士岗高频笔试题库含答案
- 海南生物会考试题及答案
- 2025年西藏辅警考试真题及答案
- 2025年场景设计考试题及答案
- 国家能源大理白族自治州2025秋招面试专业追问及参考电气工程岗位
- 六盘水市中石化2025秋招面试半结构化模拟题及答案财务与审计岗
- 教科版五年级上册科学期中测试卷附答案(夺分金卷)
- 《环氧树脂应用》课件
- 中职第1课 社会主义在中国的确立和探索试题
- 2025年辽宁省交投集团招聘笔试参考题库含答案解析
- 2024年版高尔夫球场场地租赁及会员服务协议3篇
- 香港 信托合同范本
- 建筑物拆除场地清理垃圾外运施工方案
- 国家开放大学《Web开发基础》形考任务实验1-5参考答案
- 断亲协议书模板
- 中秋国庆假期安全教育
- GB/T 19808-2005塑料管材和管件公称外径大于或等于90mm的聚乙烯电熔组件的拉伸剥离试验
评论
0/150
提交评论