案例 1 金刚石图案算法

22

Upload: markku

Post on 05-Jan-2016

120 views

Category:

Documents


5 download

DESCRIPTION

案例 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 ). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 案例 1  金刚石图案算法
Page 2: 案例 1  金刚石图案算法

案例需求1 案例描述将半径为 r的圆周 n等分,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。

2 案例效果图案例输入对话框及效果图如图所示。3 功能说明1 )程序运行界面提供文件、绘图和帮助这 3 个菜单项。2 )单机绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。

3 )以屏幕客户区中心为圆心绘制金刚石图案。

Page 3: 案例 1  金刚石图案算法

输入对话框

效果

Page 4: 案例 1  金刚石图案算法

案例分析

(x0,y0)

(x4,y4)

(x3,y3)

(x2,y2)

(x1,y1)

Page 5: 案例 1  金刚石图案算法

案例设计1 点类的设计2 对话框类的设计3 CAdamasView类的设计

4 菜单设计5 工具条设计

Page 6: 案例 1  金刚石图案算法

1 点类的设计

添加新类 定义新类

Page 7: 案例 1  金刚石图案算法

添加的新类 P2D

P2D的初始定义

Page 8: 案例 1  金刚石图案算法

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

Page 9: 案例 1  金刚石图案算法

2 对话框类的设计

添加对话框 控件表列

Page 10: 案例 1  金刚石图案算法

添加对话框类

Page 11: 案例 1  金刚石图案算法

设计对话框类

Page 12: 案例 1  金刚石图案算法

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

Page 13: 案例 1  金刚石图案算法

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

Page 14: 案例 1  金刚石图案算法

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

Page 15: 案例 1  金刚石图案算法

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

Page 16: 案例 1  金刚石图案算法

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

Page 17: 案例 1  金刚石图案算法

子菜单设计

Page 18: 案例 1  金刚石图案算法

(2)添加菜单函数

添加菜单的Diamond成员函数

Page 19: 案例 1  金刚石图案算法

5 工具条设计

Page 20: 案例 1  金刚石图案算法

案例实现1 adamasView.h文件// adamasView.h : interface of the CAdamasView class ///////////////////…………#include “P2D.h”#include “InputDlg.h”………….// Operationspublic:

void GetMaxX(); //求屏幕最大的 x坐标函数。void GetMaxY(); //求屏幕最大的 y坐标函数。void Diamond(); //绘制金刚石图案函数。

………….// Implementationpublic:

virtual ~CAdamasView();#ifdef _DEBUG

virtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;

#endifprotected:

int MaxX,MaxY; //声明屏幕最大的 x坐标和 y坐标。P2D p[50]; //声明等分点数组。double n,r; //声明等分点个数和圆的半径。

Page 21: 案例 1  金刚石图案算法

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();

}

Page 22: 案例 1  金刚石图案算法

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();

}