金刚石图案算法-孔令德_第1页
金刚石图案算法-孔令德_第2页
金刚石图案算法-孔令德_第3页
金刚石图案算法-孔令德_第4页
金刚石图案算法-孔令德_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、案例一第5章金刚石图案算法本案例知识要点l 在Visual C+ 6.0环境下创建MFC AppWizard(exe)。l 设计程序模板Test的运行界面。l 修改TestView.h和Testview.cpp文件。一、案例需求1案例描述将半径为r的圆周n等份,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。2案例效果图 案例输入对话框及效果如图1-1所示。 (a)输入对话框 (b)效果图1-1 金刚石效果图3功能说明(1)程序运行界面提供文件、绘图和帮助三个菜单项。(2)单击绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。(3)以屏幕客户区中心为圆心绘制金刚石图案。

2、二、案例分析根据案例需求,需要在MFC环境中建立一个由“文件”、“绘图”和“帮助”三个菜单项目组成的菜单,其中“文件”的子菜单为“退出”,完成退出应用程序的工作,“绘图”的子菜单为“Diamond”,用于绘制金刚石图案,“帮助“的子菜单为“关于”,用于显示开发人员信息;定义一个输入对话框类,提供个两个参数的输入界面。最后在客户区输出金刚石图案。推荐精选本案例设计一个P2D类,用于存放各个点的double型(x,y),一般而言,最大等分点不会超过50个,所以使用P2D类定义了大小为50的P2D类对象数组p50。本案例的难点在于内层循环设计时不要进行重复直线连接。例如对于等分点n5,连接情况如图1

3、-2和表1-1所示。x4,y4x0,y0x1,y1x2,y2x3,y3 图1-2 n5时的直线连接点表1-1 直线连接点的计算起点终点(x0,y0)(x1,y1),(x2,y2),(x3,y3),(x4,y4)(x1,y1)(x2,y2),(x3,y3),(x4,y4)(x2,y2)(x3,y3),(x4,y4)(x3,y3)(x4,y4)为此,设计一个二重循环,代表起点的外层循环从i=0循环到i=n-2,代表终点的内层循环从j=i+1循环到i=n-1。以pi.x,pi.y作为起点,以pj.x,pj.y作为终点绘制连接线。三、案例设计1点类的设计class P2D public:增加单词间的空

4、格P2D();增加单词间的空格virtual P2D();double x;double y;为了保证运算精度,本案例设计了P2D类,其数据成员为double型的(x,y)。在类视图ClassView里选中Test Classes单击鼠标右键选择New Class,打开New Class对话框,如图1-3所示。在Class type中选择Generic Class一般类,在Name中输入类名P2D,如图1-4所示。单击【OK】按钮,在类视图【ClassView】里添加了新类P2D,如图1-5所示。在文件视图的Source Files下VC+向导自动添加了推荐精选“P2D.h”和“P2D.cpp

5、”文件, 如图1-6所示。找到“P2D.h”文件双击打开,类的初始定义如图1-7所示。修改类的定义,添加double 型成员变量x和y,完成P2D类的设计,结果如图1-8所示。 图1-3 添加新类 图1-4 定义新类 图1-5 添加的新类P2D 图1-6“P2D.h”和“P2D.cpp”文件 图1-7 P2D的初始定义 图1-8 P2D的完整定义2对话框类的设计在资源视图Resource View上选择Dialog,单击右键,选择Insert Dialog,在对话框内添加静态文本Static Text和编辑框Edit Box控件并修改属性,Edit1控件的ID为IDC_EDIT1,Edit2控

6、件的ID为IDC_EDIT2,对话框的设计结果如图1-9所示。这里使用了VC+控件Controls,可以在工具条空白处右击鼠标选择Controls使之显示,如图1-10所示。推荐精选 图1-9 参数输入对话框设计 图1-10 控件表列双击对话框弹出Adding a Class对话框,如图1-11所示,保持默认值添加一个新类Creat a new class,单击OK按钮。在弹出的对话框中填写对话框类名InputDlg,如图1-12所示,单击“确定“按钮,则对话框类添加完毕。下面对对话框类进行设计。在View菜单下选择ClassWizard菜单项,选中Member Variables标签页。修改

7、成员变量的名称和类型。其中IDC_EDIT1的成员变量名为m_n,类型为double,代表等分点个数,IDC_EDIT2的成员变量名为m_r,类型为double,代表圆的半径,点击OK按钮退出。设计结果如图1-13所示。 图1-11 添加对话框类 图1-12 输入对话框类名推荐精选 图1-13 对话框类成员变量的设计3CTestView类的设计(1)数据成员double MaxX,MaxY;声明屏幕的最大x坐标和y坐标。 P2D p50;声明等分点数组; double n,r;声明等分点个数和圆的半径。2 成员函数 void GetMaxX();求屏幕的最大x坐标函数。 void GetMax

8、Y();求屏幕的最大y坐标函数。void Diamond();绘制金刚石图案函数。为了能直接利用MFC已经建立的CTestView类,实现金刚石图案的绘制。下面将数据成员和成员函数添加到CTestView类。在文件视图的Source Files下找到“TestView.h”文件双击打开,分别添加数据成员和成员函数的声明,结果如图1-14所示。需要说明的是在“TestView.h”文件中定义了P2D类对象数组p50,就需要在本文件中包含“P2D.h”头文件,即在文件头加入#include P2D.h语句。同样为了能在“TestView.cpp”里调用对话框类,就需要在“TestView.h”里包

9、含对话框头文件,即在文件头加入#include InputDlg.h语句。在文件视图的Source Files下找到TestView.cpp文件双击打开,添加成员函数的定义,结果如图1-15所示。推荐精选 图1-14 添加变量成员和成员函数的声明 图1-15 添加成员函数的定义4菜单设计设置菜单的ID在资源视图ResourceView上双击Menu,打开IDR_MAINFRAME,修改菜单项,结果如图1-16所示。 图1-16 菜单设计结果设置子菜单“退出”的ID为ID_APP_EXIT,子菜单Diamond的ID为ID_MENUDiamond,子菜单“关于”的ID为ID_APP_ABOUT,

10、如图1-17所示。 图1-17 子菜单ID设计结果 添加菜单函数子菜单“退出”和“关于”的操作函数系统框架建立时已经提供。这里讲解为子菜单Diamond添加操作函数的过程。从主菜单View中打开类向导Class wizard。在Object IDs中选择ID_MENUDiamond,在Class name中选择CTestView,在Message中选择COMMAND后,单击Add Function按钮,弹出Add Member Function对话框,保持默认菜单成员函数的名字OnMENUDimond(),单击OK按钮,则在Member function中为菜单Diamond添加了操作函数On

11、MENUDimond(),该函数是CTestView类的成员函数,系统已经自动进行了声明,添加过程如图1-18推荐精选所示。单击Edit Code按钮可以对OnMENUDimond()函数进行编辑。 图1-18 添加菜单【Diamond】成员函数 图1-19 添加图标5工具条设计在资源视图ResouceView中,双击Toolbar下的IDR_MAINFRAME,打开系统框架提供的工具条,将原有图标全部拖动至图标编辑处予以删除。选中IDR_MAINFRAME,单击鼠标右键,在弹出菜单中选择Import,弹出导入资源对话框如图1-19和图1-20所示。图标导入结果如图1-21所示。选中图示dra

12、w.ico图标,单击Edit|Copy。双击Toolbar下的IDR_MAINFRAME,打开工具条,选中空白图标进行Paste,结果如图1-22所示。 图1-20 导入资源 图1-21 图标导入结果 图1-22 添加图标 图1-23 修改图标的ID双击该图标,弹出Toolbar Button Properties对话框,修改其ID号为子菜单Diamond的ID,即ID_MENUDimond,以实现图标和子菜单的关联,如图1-23所示。按照以上步骤,重复设计与子菜单退出相关联的图标。工具条设计结果如图1-24所示,其中第一个图标代表“退出”,其ID等于“文件”|“退出”的ID,即ID_APP_

13、EXIT;第二个图标代表推荐精选“绘图”,其ID等于“绘图”|“Diamond”的ID,即ID_MENUDiamond;第三个图标代表“关于”,其ID等于“帮助”|“关于”的ID,即ID_APP_ABOUT。图1-22 工具条设计结果 四、案例实现1TestView.h文件/ TestView.h : interface of the CTestView class/#if !defined(AFX_TESTVIEW_H_6DC176FC_B545_4EDA_9B99_E1F77854170A_INCLUDED_)#define AFX_TESTVIEW_H_6DC176FC_B545_4ED

14、A_9B99_E1F77854170A_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include P2D.h/包含二维点头文件#include InputDlg.h/包含对话框头文件class CTestView : public CViewprotected: / create from serialization onlyCTestView();DECLARE_DYNCREATE(CTestView)/ Attributespublic:CTestDoc* GetDocument();/ Operationsp

15、ublic:void GetMaxX();/计算屏幕坐标中心x函数 void GetMaxY();/计算屏幕坐标中心y函数void Diamond(); /绘制金刚石函数/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CTestView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:推荐精选vi

16、rtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CTestView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) c

17、onst;#endifprotected:int MaxX,MaxY;/屏幕最大坐标P2D p50;/定义对象数组double n,r;/定义等分点和圆的半径/ Generated message map functionsprotected:/AFX_MSG(CTestView)afx_msg void OnMENUDiamond();/AFX_MSGDECLARE_MESSAGE_MAP();#ifndef _DEBUG / debug version in TestView.cppinline CTestDoc* CTestView:GetDocument() return (CTest

18、Doc*)m_pDocument; #endif/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_TESTVIEW_H_6DC176FC_B545_4EDA_9B99_E1F77854170A_INCLUDED_)2TestView. cpp文件/ TestView.cpp : implementation of the CTestView class#include st

19、dafx.h#include Test.h#include TestDoc.h#include TestView.h#define ROUND(a) int(a+0.5)/四舍五入#include math.h/数学头文件推荐精选#define PI 3.1415926/PI的宏定义#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif / CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTes

20、tView, CView)/AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUDiamond, OnMENUDiamond)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CTestView

21、construction/destructionCTestView:CTestView()/ TODO: add construction code hereCTestView:CTestView()BOOL CTestView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CTestView drawingvoid CTestView:OnDra

22、w(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here推荐精选/ CTestView printingBOOL CTestView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CTestView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/

23、TODO: add extra initialization before printingvoid CTestView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CTestView diagnostics#ifdef _DEBUGvoid CTestView:AssertValid() constCView:AssertValid();void CTestView:Dump(CDumpContext& dc) constCView:Dump(dc);CTestDo

24、c* CTestView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CTestDoc);return (CTestDoc*)m_pDocument;#endif /_DEBUG/ CTestView message handlersvoid CTestView:GetMaxX()/求屏幕最大x值CRect Rect;GetClientRect(&Rect);推荐精选 MaxX=Rect.right;void CTestView:GetMaxY()/求屏幕最大y值CRect Rect;GetClientRect(&Rect); MaxY=Rect.bottom;void CTestView:Diamond()/金刚石函数/n为等分点的个数,r为圆的半径 CClientDC dc(this);/设置客户区设备上下文CP

温馨提示

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

评论

0/150

提交评论