1 / 22

案例 1 金刚石图案算法

案例 1 金刚石图案算法. 案例需求. 1 案例描述 将半径为 r 的圆周 n 等分,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。 2 案例效果图 案例输入对话框及效果图如图所示。 3 功能说明 1 )程序运行界面提供文件、绘图和帮助这 3 个菜单项。 2 )单机绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。 3 )以屏幕客户区中心为圆心绘制金刚石图案。. 输入框和效果. 输入对话框. 效果. 案例分析. (x 2 ,y 2 ). (x 1 ,y 1 ). (x 3 ,y 3 ). (x 0 ,y 0 ).

markku
Download Presentation

案例 1 金刚石图案算法

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 案例1 金刚石图案算法

  2. 案例需求 • 1 案例描述 • 将半径为r的圆周n等分,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。 • 2 案例效果图 • 案例输入对话框及效果图如图所示。 • 3 功能说明 • 1)程序运行界面提供文件、绘图和帮助这3个菜单项。 • 2)单机绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。 • 3)以屏幕客户区中心为圆心绘制金刚石图案。

  3. 输入框和效果 输入对话框 效果

  4. 案例分析 (x2,y2) (x1,y1) (x3,y3) (x0,y0) (x4,y4)

  5. 案例设计 • 1 点类的设计 • 2 对话框类的设计 • 3 CAdamasView类的设计 • 4 菜单设计 • 5 工具条设计

  6. 1 点类的设计 添加新类 定义新类

  7. 添加的新类P2D P2D的初始定义

  8. 在”P2D.h”上修改类的定义

  9. 2 对话框类的设计 添加对话框 控件表列

  10. 添加对话框类

  11. 设计对话框类

  12. 3 CAdamasView类的设计 • 数据成员 • double MaxX, MaxY; 声明屏幕最大的x坐标和y坐标。 • P2D p[50]; 声明等分点数组。 • double n, r; 声明等分点个数和圆的半径。 • 成员函数 • void GetMaxX(); 求屏幕最大的x坐标函数。 • void GetMaxY(); 求屏幕最大的y坐标函数。 • void Diamond(); 绘制金刚石图案函数。

  13. 将数据成员和成员函数添加到CAdamasView类。 • 在adamasView.h中分别添加数据成员和成员函数的声明。定义了P2D类对象数组p[50],需要再本文件中包含P2D.h头文件,即加入#include “P2D.h”语句。同样为了能在“adamasView.cpp”里调用对话框类,就需要在adamasView.h里包含对话框头文件,即加入“InputDlg.h”语句。

  14. admasView.h中添加变量成员和成员函数的声明

  15. admasView.cpp中添加成员函数的定义

  16. 4 菜单设计 • (1)设置菜单的ID。

  17. 子菜单设计

  18. (2)添加菜单函数 添加菜单的Diamond成员函数

  19. 5 工具条设计

  20. 案例实现 1 adamasView.h文件 // adamasView.h : interface of the CAdamasView class /////////////////// ………… #include “P2D.h” #include “InputDlg.h” …………. // Operations public: void GetMaxX(); //求屏幕最大的x坐标函数。 void GetMaxY(); //求屏幕最大的y坐标函数。 void Diamond(); //绘制金刚石图案函数。 …………. // Implementation public: virtual ~CAdamasView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: int MaxX,MaxY; //声明屏幕最大的x坐标和y坐标。 P2D p[50]; //声明等分点数组。 double n,r; //声明等分点个数和圆的半径。

  21. 2. adamasView.cpp文件 #define ROUND(a) int(a+0.5) //四舍五入 #include "math.h" //数学头文件 #define PI 3.1415926 //PI的宏定义 ……….. void CAdamasView::GetMaxX() //求屏幕最大x值 { CRect Rect; GetClientRect(&Rect); MaxX=Rect.right; } void CAdamasView::GetMaxY() //求屏幕最大x值 { CRect Rect; GetClientRect(&Rect); MaxY=Rect.bottom; } void CAdamasView::Diamond() //金刚石函数 { //n为等分点的个数,r为圆的半径 CClientDC dc(this); //设置客户区设备上下文 CPen MyPen,*OldPen; MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255)); OldPen=dc.SelectObject(&MyPen); double Thta; Thta=2*PI/n; for(int i=0;i<n;i++) { p[i].x=r*cos(i*Thta)+MaxX/2; p[i].y=r*sin(i*Thta)+MaxY/2; } for(i=0;i<=n-2;i++) { for(int j=i+1;j<=n-1;j++) { dc.MoveTo(ROUND(p[i].x),ROUND(p[i].y)); dc.LineTo(ROUND(p[j].x),ROUND(p[j].y)); } } dc.SelectObject(OldPen); MyPen.DeleteObject(); }

  22. void CAdamasView::OnMENUDiamond() //菜单函数 { // TODO: Add your command handler code here InputDlg dlg; if (dlg.DoModal()==IDOK) //调用对话框模块,判断是否单击OK按钮 n=dlg.m_n;r=dlg.m_r; //对话框参数赋值 AfxGetMainWnd()->SetWindowText("案例:金刚石图案"); RedrawWindow(); //重绘窗口 GetMaxX();GetMaxY(); Diamond(); }

More Related