2014计算机图形学课程设计1课程设计I金刚石图案算法知识要点自定义二维坐标系。二维点类的定义方法。对话框的创建及调用方法。金刚石图案算法。一维堆内存的分配与释放。设计个性化的菜单项与工具栏。创建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所示。2014计算机图形学课程设计2(a)输入对话框(b)金刚石图案图1-1输入对话框及效果图二、案例分析本案例设计的目的是使用VisualC++的MFC开发平台来建立一个Test工程,为后续的案例设计提供一个通用的工程模板。Test工程包含了菜单设计、工具栏图标按钮设计、输入对话框设计和关于对话框设计等任务。在建立Test工程模板的基础上,本案例以绘制金刚石图案为例,讲解二维点类CP2的设计方法和CTestView类的修改方法。1.菜单和工具栏按钮根据案例的功能要求,需要在MFC环境中建立一个由“文件”、“图形”和“帮助”3个菜单项组成的弹出菜单,其中“文件”菜单项的子菜单为“退出”,用于退出Test工程,如图1-2所示;“图形”菜单项的子菜单为“绘图”,用于调用输入对话框绘制金刚石图案,如图1-3所示;“帮助”菜单项的子菜单为“关于”,用于显示开发人员信息,如图1-4所示。工具栏上的图标按钮代表“退出”子菜单、图标按钮代表“绘图”子菜单,图标按钮代表“关于”子菜单。关联图标按钮与菜单项的方法是让二者具有相同的ID号。由于标题栏图标的大小为16×16,Debug文件夹内的图标的大小为32×32,本案例将系统标题栏默认图标修改为,将Debug文件夹内的默认图标修改为。图1-2“退出”子菜单图1-3“绘图”子菜单图1-4“关于”子菜单2.对话框(1)定义输入对话框类CInputDlg,输入“等分点个数”和“圆的半径”两个参数,2014计算机图形学课程设计3如图1-1(a)所示。(2)新关于对话框是在Test工程提供的原关于对话框的基础上修改而成,如图1-5所示。(a)原“关于”对话框(b)新“关于”对话框图1-5“关于”对话框3.二维点类图形是由像素点组成的,像素点的绘制使用的是整数坐标。在图形的设计过程中,为了保证计算精度,使用了双精度数,将计算结果输出到屏幕时,需要将双精度数值转换为整数值。本案例定义了二维坐标点类CP2(在VisualC++中,常用大写字母C开始的标识符作为类名),用于对各个点的double型坐标(x,y)进行整体处理,如图1-6所示。CP2+x:double+y:double图1-6二维点类类图图1-7n=5时的线段连接类图1-6中,“+”代表公有成员(“-”代表私有成员,“#”代表保护成员)。虽然一般在类的设计中常将成员变量设置为私有成员,但二维点类中的(x,y)主要用于类外赋值,因此CP2类使用了公有数据成员。4.金刚石图案金刚石图案是每一个顶点都与其它顶点相连的正n边形。金刚石图案有时被用做计算机图形设备的测试图案,其有序的形状可以揭示任何扭曲。通过观察交汇于每个顶点的直线所呈现出来的拥挤和模糊程度,可以确定设备的分辨率。本案例设计的技巧是使用线段连接每个顶点时不进行重复连接。例如当圆的等分点个P0P1P2P3P42014计算机图形学课程设计4数n=5时,只连接5段直线。线段的连接情况如图1-7所示,线段端点见表1-1。表1-1线段连接方式起点终点P0P1,P2,P3,P4P1P2,P3,P4P2P3,P4P3P45.一维堆内存圆的等分点个数是输入值,需要定义动态对象数组保存等分点坐标,以实现绘制任意等分点个数的金刚石图案。本案例定义了CP2类的一维对象数组指针P。使用动态对象数组,可以避免静态数组的“大开小用”的弊端。动态数组在堆区中分配,动态数组的大小只有在程序运行时才能确定,这样编译器在编译时就无法为它们预留内存空间,在程序运行时才根据输入值进行内存分配,这种方法称为动态内存分配。VisualC++中一维动态数组分配的格式为指针变量名=new类型名[下标表达式];new运算符返回的是一个指向所分配类型数组的指针,动态创建的数组本身没有名字。使用new运算符创建数组时只能调用类的默认构造函数。如果类内定义了一个带参构造函数,VisualC++将不再提供默认构造函数,这时需要显式定义默认构造函数。使用new运算符的最大问题是容易造成内存泄漏。为了避免内存泄漏,需要使用delete运算符来释放由new运算符所分配的堆空间。VisualC++中动态数组释放的格式为delete[]指向该数组的指针变量名;数组分配格式和数组释放格式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,编译器认为该指针是指向数组第一个元素的指针,只回收了第一个元素所占内存空间,产生回收不彻底的问题。加了方括号后就转化为指向数组的指针,回收了整个数组。delete[]的方括号中不需要填数组元素数,由系统自己确定。即便写了,编译器也会忽略。三、算法设计(1)读入圆的等分点个数n与圆的半径r。(2)根据等分点个数计算金刚石图案的等分角n2。(3)计算金刚石图案的起始角2。α是用于调整金刚石图案的起始位置,调整情况如图1-8所示。2014计算机图形学课程设计5(a)α=0(b)2图1-8调整金刚石图案的方位(4)将圆等分后的顶点坐标存储于数组P中。(5)设计一个二重循环,代表起点的外层整型变量i从i=0循环到i=n-2;代表终点的内层整型变量j从j=i+1循环到j=n-1。以p[i]为起点,以p[j]为终点连接各线段构成金刚石图案。四、案例设计1.设计Test工程模板微软基类库(microsoftfoundationclasslibrary,MFC)是以C++形式封装的WindowsAPI(applicationprograminterface),包含了200多个已经定义好的常用类。MFC向导(MFCAppWizard(exe))生成了一个应用程序框架,通过添加或修改框架代码可以完成具体设计任务。作为上机操作的基础,首先讲解创建基于MFC的Test工程模板的步骤。(1)在图1-9所示的VisualC++集成开发环境中,选择File|New命令,弹出New对话框,切换到Projects选项卡。在左边窗口中选择MFCAppWizard(exe),在右边的Projectname文本框中输入工程名,这里输入Test,在Location文本框中出现用于存放工程的目录,这里设置为D:\Test。其余保持默认值。如图1-10所示。单击OK按钮。2014计算机图形学课程设计6图1-9VisualC++集成开发环境图1-10New对话框(2)在MFCAppWizard-Step1对话框中,选中SingleDocument单选按钮,其余保持默认值,如图1-11所示。单击Finish按钮结束。(3)弹出NewProjectInformation对话框,如图1-12所示,应用程序向导创建了应用类CTestApp,框架类CMainFrame,文档类CTestDoc和视图类CTestView。单击OK按钮。图1-11MFCAppWizard-Step1对话框图1-12NewProjectInformation对话框(4)完成上述步骤后,应用程序Test的MFC框架即已生成,出现程序工作区。如图1-13所示。图1-13应用程序的MFC框架在工作区的ClassView标签页中显示MFCAppWizard(exe)所创建的类,主要包括CAboutDlg、CMainFrame、CTestApp、CTestDoc和CTestView等类,如图1-14所示。在ResourceView标签页中显示所创建的资源,主要包括Accelerator、Dialog、Icon、Menu、StringTable、Toolbar和Version等资源,如图1-15所示。在FileView标签页中显示源程序文件,主要包括SourceFiles、HeadFiles和ResourceFiles等文件,如图1-16所示。2014计算机图形学课程设计7图1-14ClassView标签页图1-15ResourceView标签页图1-16FileView标签页从ClassView标签页可以看出,CTestApp是应用的主函数类,是应用程序的入口。MFC中的数据是存储在CTestDoc类文档中,而结果的显示则是在CTestView类中,即显示在CMainFrame类的客户区中。MFC中的Doc/View结构用来将程序的数据本身与数据显示相互隔离,CTestDoc类的Serialize()函数负责管理数据,CTestView类的OnDraw()函数用于显示数据。全部展开FileView标签页后,显示如图1-17所示的内容。图1-17FileView标签页全部展开显示(5)单击图1-18所示工具栏上的按钮,就可以直接编译、连接和运行程序。Test工程运行结果如图1-19所示。至此,尽管未编写一句代码,但Test工程已经生成了一个可执行的应用程序框架。后续的工作就是针对具体的设计任务,为该框架添加程序代码和修改资源文件。2014计算机图形学课程设计8图1-18执行按钮图1-19运行结果2.设计菜单和工具栏按钮⑴设置菜单的ID在资源标签页ResourceView上双击Menu,打开IDR_MAINFRAME,修改菜单项内容,结果如图1-20所示。图1-20菜单设计结果2014计算机图形学课程设计9设置子菜单“退出”的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所示,弹出ImportResource对话框如图1-23所示。本案例使用表1-2所示的图标app.ico代表Test应用程序,图标draw.ico代表“绘图”子菜单,图标exit.ico代表“退出”子菜单,图标help.ico代表“关于”子菜单。图标导入结果如图1-24的Icon资源项下的IDI_ICON1~IDI_ICON4所示。图1-22导入资源菜单选项图1-23ImportResource对话框表1-2图标标识和图标文件的对应关系ID标识图标文件名图标IDI_ICON1app.icoIDI_ICON2draw.icoIDI_ICON3exit.icoIDI_ICON4help.ico2014计算机图形学课程设计10双击Toolbar下的IDR_MAINFRAME打开工具栏,将系统提供的默认图标拖动至图标编辑处予以删除。选中空白图标处依次粘贴图标文件IDI_ICON3、IDI_ICON