220 likes | 429 Views
案例 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 ).
E N D
案例需求 • 1 案例描述 • 将半径为r的圆周n等分,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。 • 2 案例效果图 • 案例输入对话框及效果图如图所示。 • 3 功能说明 • 1)程序运行界面提供文件、绘图和帮助这3个菜单项。 • 2)单机绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。 • 3)以屏幕客户区中心为圆心绘制金刚石图案。
输入框和效果 输入对话框 效果
案例分析 (x2,y2) (x1,y1) (x3,y3) (x0,y0) (x4,y4)
案例设计 • 1 点类的设计 • 2 对话框类的设计 • 3 CAdamasView类的设计 • 4 菜单设计 • 5 工具条设计
1 点类的设计 添加新类 定义新类
添加的新类P2D P2D的初始定义
2 对话框类的设计 添加对话框 控件表列
3 CAdamasView类的设计 • 数据成员 • double MaxX, MaxY; 声明屏幕最大的x坐标和y坐标。 • P2D p[50]; 声明等分点数组。 • double n, r; 声明等分点个数和圆的半径。 • 成员函数 • void GetMaxX(); 求屏幕最大的x坐标函数。 • void GetMaxY(); 求屏幕最大的y坐标函数。 • void Diamond(); 绘制金刚石图案函数。
将数据成员和成员函数添加到CAdamasView类。 • 在adamasView.h中分别添加数据成员和成员函数的声明。定义了P2D类对象数组p[50],需要再本文件中包含P2D.h头文件,即加入#include “P2D.h”语句。同样为了能在“adamasView.cpp”里调用对话框类,就需要在adamasView.h里包含对话框头文件,即加入“InputDlg.h”语句。
4 菜单设计 • (1)设置菜单的ID。
(2)添加菜单函数 添加菜单的Diamond成员函数
案例实现 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; //声明等分点个数和圆的半径。
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(); }
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(); }