金刚石图案算法孔令德

上传人:沈*** 文档编号:103344304 上传时间:2022-06-08 格式:DOC 页数:10 大小:84.50KB
返回 下载 相关 举报
金刚石图案算法孔令德_第1页
第1页 / 共10页
金刚石图案算法孔令德_第2页
第2页 / 共10页
金刚石图案算法孔令德_第3页
第3页 / 共10页
点击查看更多>>
资源描述
.案例一第5章金刚石图案算法本案例知识要点l 在Visual C+ 6.0环境下创建MFC AppWizard。l 设计程序模板Test的运行界面。l 修改TestView.h和Testview.cpp文件。一、案例需求1案例描述将半径为r的圆周n等份,然后用直线将各等分点隔点相连,形成的图案称为金刚石图案,试编程实现。2案例效果图 案例输入对话框及效果如图1-1所示。a输入对话框 b效果图1-1 金刚石效果图3功能说明1程序运行界面提供文件、绘图和帮助三个菜单项。2单击绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。3以屏幕客户区中心为圆心绘制金刚石图案。二、案例分析根据案例需求,需要在MFC环境中建立一个由文件、绘图和帮助三个菜单项目组成的菜单,其中文件的子菜单为退出,完成退出应用程序的工作,绘图的子菜单为Diamond,用于绘制金刚石图案,帮助的子菜单为关于,用于显示开发人员信息;定义一个输入对话框类,提供个两个参数的输入界面。最后在客户区输出金刚石图案。本案例设计一个P2D类,用于存放各个点的double型x,y,一般而言,最大等分点不会超过50个,所以使用P2D类定义了大小为50的P2D类对象数组p50。本案例的难点在于内层循环设计时不要进行重复直线连接。例如对于等分点n5,连接情况如图1-2和表1-1所示。x4,y4x0,y0x1,y1x2,y2x3,y3图1-2 n5时的直线连接点表1-1 直线连接点的计算起点终点x0,y0x1,y1,x2,y2,x3,y3,x4,y4x1,y1x2,y2,x3,y3,x4,y4x2,y2x3,y3,x4,y4x3,y3x4,y4为此,设计一个二重循环,代表起点的外层循环从i=0循环到i=n-2,代表终点的内层循环从j=i+1循环到i=n-1。以pi.x,pi.y作为起点,以pj.x,pj.y作为终点绘制连接线。三、案例设计1点类的设计class P2D public:增加单词间的空格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文件, 如图1-6所示。找到P2D.h文件双击打开,类的初始定义如图1-7所示。修改类的定义,添加double 型成员变量x和y,完成P2D类的设计,结果如图1-8所示。图1-3 添加新类 图1-4 定义新类图1-5 添加的新类P2D 图1-6P2D.h和P2D.cpp文件图1-7 P2D的初始定义 图1-8 P2D的完整定义2对话框类的设计在资源视图Resource View上选择Dialog,单击右键,选择Insert Dialog,在对话框内添加静态文本Static Text和编辑框Edit Box控件并修改属性,Edit1控件的ID为IDC_EDIT1,Edit2控件的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标签页。修改成员变量的名称和类型。其中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;声明等分点个数和圆的半径。 成员函数 void GetMaxX;求屏幕的最大x坐标函数。 void GetMaxY;求屏幕的最大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里包含对话框头文件,即在文件头加入#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,如图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添加了操作函数OnMENUDimond,该函数是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所示。选中图示draw.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_EXIT;第二个图标代表绘图,其ID等于绘图|Diamond的ID,即ID_MENUDiamond;第三个图标代表关于,其ID等于帮助|关于的ID,即ID_APP_ABOUT。图1-22 工具条设计结果 四、案例实现1TestView.h文件/ TestView.h : interface of the CTestView class/#if !defined#define AFX_TESTVIEW_H_6DC176FC_B545_4EDA_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/ Attributespublic:CTestDoc* GetDocument;/ Operationspublic:void GetMaxX;/计算屏幕坐标中心x函数 void GetMaxY;/计算屏幕坐标中心y函数void Diamond; /绘制金刚石函数/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUALpublic:virtual void OnDraw; / overridden to draw this viewvirtual BOOL PreCreateWindow;protected:virtual BOOL OnPreparePrinting;virtual void OnBeginPrinting;virtual void OnEndPrinting;/AFX_VIRTUAL/ Implementationpublic:virtual CTestView;#ifdef _DEBUGvirtual void AssertValid const;virtual void Dump const;#endifprotected:int MaxX,MaxY;/屏幕最大坐标P2D p50;/定义对象数组double n,r;/定义等分点和圆的半径/ Generated message map functionsprotected:/AFX_MSGafx_msg void OnMENUDiamond;/AFX_MSGDECLARE_MESSAGE_MAP;#ifndef _DEBUG / debug version in TestView.cppinline CTestDoc* CTestView:GetDocument return m_pDocument; #endif/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined2TestView. cpp文件/ TestView.cpp : implementation of the CTestView class#include stdafx.h#include Test.h#include TestDoc.h#include TestView.h#define ROUND int/四舍五入#include math.h/数学头文件#define PI 3.1415926/PI的宏定义#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif / CTestViewIMPLEMENT_DYNCREATEBEGIN_MESSAGE_MAP/AFX_MSG_MAPON_COMMAND/AFX_MSG_MAP/ Standard printing commandsON_COMMANDON_COMMANDON_COMMANDEND_MESSAGE_MAP/ CTestView construction/destructionCTestView:CTestView/ TODO: add construction code hereCTestView:CTestViewBOOL CTestView:PreCreateWindow/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow;/ CTestView drawingvoid CTestView:OnDrawCTestDoc* pDoc = GetDocument;ASSERT_VALID;/ TODO: add draw code for native data here/ CTestView printingBOOL CTestView:OnPreparePrinting/ default preparationreturn DoPreparePrinting;void CTestView:OnBeginPrinting/ TODO: add extra initialization before printingvoid CTestView:OnEndPrinting/ TODO: add cleanup after printing/ CTestView diagnostics#ifdef _DEBUGvoid CTestView:AssertValid constCView:AssertValid;void CTestView:Dump constCView:Dump;CTestDoc* CTestView:GetDocument / non-debug version is inlineASSERTIsKindOfRUNTIME_CLASS;return m_pDocument;#endif /_DEBUG/ CTestView message handlersvoid CTestView:GetMaxX/求屏幕最大x值CRect Rect;GetClientRect; MaxX=Rect.right;void CTestView:GetMaxY/求屏幕最大y值CRect Rect;GetClientRect; MaxY=Rect.bottom;void CTestView:Diamond/金刚石函数/n为等分点的个数,r为圆的半径 CClientDC dc;/设置客户区设备上下文CPen MyPen,*OldPen;MyPen.CreatePenPS_SOLID,1,RGB;OldPen=dc.SelectObject;double Thta;/thta为圆的等分角Thta=2*PI/n;forint i=0;ipi.x=r*cos+MaxX/2;pi.y=r*sin+MaxY/2;fori=0;iforint j=i+1;jdc.MoveToROUND,ROUND;dc.LineToROUND,ROUND;dc.SelectObject;MyPen.DeleteObject;void CTestView:OnMENUDiamond/菜单函数/ TODO: Add your command handler code hereInputDlg dlg;if dlg.DoModal=IDOK/调用对话框模块,判断是否单击OK按钮n=dlg.m_n; /对话框参数赋值r=dlg.m_r; AfxGetMainWnd-SetWindowText;RedrawWindow;/重绘窗口GetMaxX;GetMaxY;Diamond;五、案例说明本案例定义新类P2D,同时使用了MFC框架生成的CTestView类。每个类都是由*.h文件和*.cpp文件组成。例如CTestView类是由TestView.h头文件和TestView.cpp文件构成。在TestView.h文件里声明了保护数据成员MaxX,MaxY,p50,n,r和公有成员函数GetMaxX,GetMaxY、Diamond;在TestView.cpp文件里给出了GetMaxX,GetMaxY以及Diamond函数的具体定义。因为设备坐标系的像素值为整数,所以在TestView.cpp文件里定义了带参数的宏#define ROUND int,用于绘图时对像素点的计算结果进行四舍五入。请读者认真体会类之间的通讯方式,例如P2D类、InputDlg类和CTestView类。本案例采用在TestView.h中包含P2D.h和InputDlg.h头文件的方法实现。本案例完成的程序框架将成为本书的基本程序模板,后续的案例都是在本框架的基础上修改实现的。.
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!