案例 1 金刚石图案算法
description
Transcript of 案例 1 金刚石图案算法
案例需求1 案例描述将半径为 r的圆周 n等分,然后用直线将各等分点隔点相连,形成的图案称为“金刚石”图案,试编程实现。
2 案例效果图案例输入对话框及效果图如图所示。3 功能说明1 )程序运行界面提供文件、绘图和帮助这 3 个菜单项。2 )单机绘图菜单,弹出对话框读入圆的等分点个数和圆的半径。
3 )以屏幕客户区中心为圆心绘制金刚石图案。
输入对话框
效果
案例分析
(x0,y0)
(x4,y4)
(x3,y3)
(x2,y2)
(x1,y1)
案例设计1 点类的设计2 对话框类的设计3 CAdamasView类的设计
4 菜单设计5 工具条设计
1 点类的设计
添加新类 定义新类
添加的新类 P2D
P2D的初始定义
在” P2D.h”上修改类的定义
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”语句。
admasView.h中添加变量成员和成员函数的声明
admasView.cpp中添加成员函数的定义
4 菜单设计(1)设置菜单的 ID。
子菜单设计
(2)添加菜单函数
添加菜单的Diamond成员函数
5 工具条设计
案例实现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; //声明等分点个数和圆的半径。
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();
}