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

下载本文档

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

文档简介

..案例一第5章案例一第5章金刚石图案金刚石图案算法本案例知识要点在VisualC++6.0环境下创建MFCAppWizard<exe>。设计程序模板Test的运行界面。修改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类对象数组p[50]。本案例的难点在于内层循环设计时不要进行重复直线连接。例如对于等分点n=5,连接情况如图1-2和表1-1所示。x4,y4xx4,y4x0,y0x1,y1x2,y2x3,y3图1-2n=5时的直线连接点表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。以p[i].x,p[i].y作为起点,以p[j].x,p[j].y作为终点绘制连接线。三、案例设计1.点类的设计classP2D{public:增加单词间的空格 P2D<>;增加单词间的空格增加单词间的空格 virtual~P2D<>;增加单词间的空格 doublex; doubley;};为了保证运算精度,本案例设计了P2D类,其数据成员为double型的〔x,y。在类视图ClassView里选中TestClasses单击鼠标右键选择NewClass,打开NewClass对话框,如图1-3所示。在Classtype中选择GenericClass一般类,在Name中输入类名P2D,如图1-4所示。单击[OK]按钮,在类视图[ClassView]里添加了新类P2D,如图1-5所示。在文件视图的SourceFiles下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-6"P2D.h"和"P2D.cpp"文件图1-7P2D的初始定义图1-8P2D的完整定义2.对话框类的设计在资源视图ResourceView上选择Dialog,单击右键,选择InsertDialog,在对话框内添加静态文本StaticText和编辑框EditBox控件并修改属性,Edit1控件的ID为IDC_EDIT1,Edit2控件的ID为IDC_EDIT2,对话框的设计结果如图1-9所示。这里使用了VC++控件Controls,可以在工具条空白处右击鼠标选择Controls使之显示,如图1-10所示。图1-9参数输入对话框设计图1-10控件表列双击对话框弹出AddingaClass对话框,如图1-11所示,保持默认值添加一个新类Creatanewclass,单击OK按钮。在弹出的对话框中填写对话框类名InputDlg,如图1-12所示,单击"确定"按钮,则对话框类添加完毕。下面对对话框类进行设计。在View菜单下选择ClassWizard菜单项,选中MemberVariables标签页。修改成员变量的名称和类型。其中IDC_EDIT1的成员变量名为m_n,类型为double,代表等分点个数,IDC_EDIT2的成员变量名为m_r,类型为double,代表圆的半径,点击OK按钮退出。设计结果如图1-13所示。图1-11添加对话框类图1-12输入对话框类名图1-13对话框类成员变量的设计3.CTestView类的设计〔1数据成员①doubleMaxX,MaxY;声明屏幕的最大x坐标和y坐标。P2Dp[50];声明等分点数组;doublen,r;声明等分点个数和圆的半径。成员函数voidGetMaxX<>;求屏幕的最大x坐标函数。voidGetMaxY<>;求屏幕的最大y坐标函数。③voidDiamond<>;绘制金刚石图案函数。为了能直接利用MFC已经建立的CTestView类,实现金刚石图案的绘制。下面将数据成员和成员函数添加到CTestView类。在文件视图的SourceFiles下找到"TestView.h"文件双击打开,分别添加数据成员和成员函数的声明,结果如图1-14所示。需要说明的是在"TestView.h"文件中定义了P2D类对象数组p[50],就需要在本文件中包含"P2D.h"头文件,即在文件头加入#include"P2D.h"语句。同样为了能在"TestView.cpp"里调用对话框类,就需要在"TestView.h"里包含对话框头文件,即在文件头加入#include"InputDlg.h"语句。在文件视图的SourceFiles下找到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中打开类向导Classwizard。在ObjectIDs中选择ID_MENUDiamond,在Classname中选择CTestView,在Message中选择COMMAND后,单击AddFunction按钮,弹出AddMemberFunction对话框,保持默认菜单成员函数的名字OnMENUDimond<>,单击OK按钮,则在Memberfunction中为菜单Diamond添加了操作函数OnMENUDimond<>,该函数是CTestView类的成员函数,系统已经自动进行了声明,添加过程如图1-18所示。单击EditCode按钮可以对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双击该图标,弹出ToolbarButtonProperties对话框,修改其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工具条设计结果四、案例实现1.TestView.h文件//TestView.h:interfaceoftheCTestViewclass///////////////////////////////////////////////////////////////////////#if!defined<AFX_TESTVIEW_H__6DC176FC_B545_4EDA_9B99_E1F77854170A#defineAFX_TESTVIEW_H__6DC176FC_B545_4EDA_9B99_E1F77854170A#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include"P2D.h"//包含二维点头文件#include"InputDlg.h"//包含对话框头文件classCTestView:publicCView{protected://createfromserializationonly CTestView<>; DECLARE_DYNCREATE<CTestView>//Attributespublic: CTestDoc*GetDocument<>;//Operationspublic: voidGetMaxX<>;//计算屏幕坐标中心x函数voidGetMaxY<>;//计算屏幕坐标中心y函数 voidDiamond<>;//绘制金刚石函数//Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL<CTestView> public: virtualvoidOnDraw<CDC*pDC>;//overriddentodrawthisview virtualBOOLPreCreateWindow<CREATESTRUCT&cs>; protected: virtualBOOLOnPreparePrinting<CPrintInfo*pInfo>; virtualvoidOnBeginPrinting<CDC*pDC,CPrintInfo*pInfo>; virtualvoidOnEndPrinting<CDC*pDC,CPrintInfo*pInfo>; //}}AFX_VIRTUAL//Implementationpublic: virtual~CTestView<>;#ifdef_DEBUG virtualvoidAssertValid<>const; virtualvoidDump<CDumpContext&dc>const;#endif protected: intMaxX,MaxY;//屏幕最大坐标 P2Dp[50];//定义对象数组 doublen,r;//定义等分点和圆的半径//Generatedmessagemapfunctionsprotected: //{{AFX_MSG<CTestView> afx_msgvoidOnMENUDiamond<>; //}}AFX_MSG DECLARE_MESSAGE_MAP<>};#ifndef_DEBUG//debugversioninTestView.cppinlineCTestDoc*CTestView::GetDocument<>{return<CTestDoc*>m_pDocument;}#endif////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined<AFX_TESTVIEW_H__6DC176FC_B545_4EDA_9B99_E1F77854170A2.TestView.cpp文件//TestView.cpp:implementationoftheCTestViewclass#include"stdafx.h"#include"Test.h"#include"TestDoc.h"#include"TestView.h"#defineROUND<a>int<a+0.5>//四舍五入#include"math.h"//数学头文件#definePI3.1415926//PI的宏定义#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif////////////////////////////////////////////////////////////////////////////CTestViewIMPLEMENT_DYNCREATE<CTestView,CView>BEGIN_MESSAGE_MAP<CTestView,CView> //{{AFX_MSG_MAP<CTestView> ON_COMMAND<ID_MENUDiamond,OnMENUDiamond> //}}AFX_MSG_MAP //Standardprintingcommands ON_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<>////////////////////////////////////////////////////////////////////////////CTestViewconstruction/destructionCTestView::CTestView<>{ //TODO:addconstructioncodehere}CTestView::~CTestView<>{}BOOLCTestView::PreCreateWindow<CREATESTRUCT&cs>{ //TODO:ModifytheWindowclassorstylesherebymodifying //theCREATESTRUCTcs returnCView::PreCreateWindow<cs>;}////////////////////////////////////////////////////////////////////////////CTestViewdrawingvoidCTestView::OnDraw<CDC*pDC>{ CTestDoc*pDoc=GetDocument<>; ASSERT_VALID<pDoc>;//TODO:adddrawcodefornativedatahere}////////////////////////////////////////////////////////////////////////////CTestViewprintingBOOLCTestView::OnPreparePrinting<CPrintInfo*pInfo>{ //defaultpreparation returnDoPreparePrinting<pInfo>;}voidCTestView::OnBeginPrinting<CDC*/*pDC*/,CPrintInfo*/*pInfo*/>{ //TODO:addextrainitializationbeforeprinting}voidCTestView::OnEndPrinting<CDC*/*pDC*/,CPrintInfo*/*pInfo*/>{ //TODO:addcleanupafterprinting}////////////////////////////////////////////////////////////////////////////CTestViewdiagnostics#ifdef_DEBUGvoidCTestView::AssertValid<>const{ CView::AssertValid<>;}voidCTestView::Dump<CDumpContext&dc>const{ CView::Dump<dc>;}CTestDoc*CTestView::GetDocument<>//non-debugversionisinline{ ASSERT<m_pDocument->IsKindOf<RUNTIME_CLASS<CTestDoc>>>; return<CTestDoc*>m_pDocument;}#endif//_DEBUG////////////////////////////////////////////////////////////////////////////CTestViewmessagehandlersvoidCTestView::GetMaxX<>//求屏幕最大x值{ CRectRect; GetClientRect<&Rect>;MaxX=Rect.right;}voidCTestView::GetMaxY<>//求屏幕最大y值{ CRectRect; GetClientRect<&Rect>;MaxY=Rect.bottom;}voidCTestView::Diamond<>//金刚石函数{ //n为等分点的个数,r为圆的半径CClientDCdc<this>;//设置客户区设备上下文 CPenMyPen,*OldPen; MyPen.CreatePen<PS_SOLID,1,RGB<0,0,255>>; OldPen=dc.SelectObject<&MyPen>; doubleThta;//thta为圆的等分角 Thta=2*PI/n; for<inti=0;i<n;i++>{ p[i].x=r*cos<i*Thta>+MaxX/2;p[i].y=r*sin<i*Thta>+MaxY/2

温馨提示

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

评论

0/150

提交评论