计算机图形学-画金刚石-代码及其操作指导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作指导—金刚石图案
1.建MFC工程Test,选单文档。
2.设置窗口最大化模式,并且标题栏显示文字为:“金刚石图案”。
在BOOL CTestApp::InitInstance()中将m_pMainWnd->ShowWindow(SW_SHOW);改为m_pMainWnd->ShowWindow(SW_MAXIMIZE);//窗口最大化
紧接着加上m_pMainWnd->SetWindowText("金刚石图案");//标题设置
3.二维点类设计:点击类右键出现添加类,或在类向导中添加一个新类,在Name编辑框中输入类名CP2。选Generic Class类
修改CP2的初始定义,添加double 型变量成员x和y。修改后:
class CP2
{
public:
CP2();
virtual ~CP2();
CP2(double,double);//加上
double x;//加上
double y;//加上
};
修改构造函数
CP2::CP2()
{
this->x=0.0;
this->y=0.0;
}
定义重载构造函数
CP2::CP2(double x0,double y0)
{
this->x=x0;
this->y=y0;
}
4.输入对话框类的设计。在资源视图面板Resource View中选Dialog右键选Insert Dialog,删去取消按钮,改窗口为下图:
双击此框,在弹出的框中加上Name:CinputDlg
为输入对话框的控件映射数据成员。在建立类向导中选Member Variables。对IDC_EDIT1映射变量名为m_n,int类型,限制Minimum为3,Maximum为50; 对IDC_EDIT2映射变量名为m_r,double类型,限制Minimum为200.0,Maximum为320.0.OK退出
设置EditBox框的初值.在CinputDlg的构造函数中改为m_n = 30;
m_r = 300.0;
见CinputDlg::CinputDlg(CWnd* pParent /*=NULL*/)
: CDialog(CinputDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CinputDlg)
m_n = 30;
m_r = 300.0;
//}}AFX_DATA_INIT
}
显示:设置EditBox框的初始状态为选中.在类向导中添加消息WM_SHOINDOW的响应函数,在最后加上
void CinputDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// TODO: Add your message handler code here
GetDlgItem(IDC_EDIT1)->SetFocus();//获取编辑框焦点
((CEdit *)GetDlgItem(IDC_EDIT1))->SetSel(0,-1);//选择编辑框控件内的全部文本
}
5.菜单设计:
下拉菜单文件中的退出ID为ID_APP_EXIT 绘图的金刚石ID为ID_APP_Diamond。
提示为: 绘制金刚石图案.帮助中的关于自己改.在VIEW类中添加”金刚石”子菜单命令响应函数.
6.引入图标:在资源视图中选中Icon中双击IDR_MAINFRAME标识,打开应用程序默认图标并执行编辑中的清除.再引入所需的图标.用复制与粘贴到图标工具上,再对应相应的ID.
7.对话框贴图:从资源视图中导入图片,导入时选所有文件.打开对话框去除不用的控件,加入图片控件,右键打开属性,类型改为位图,图像选中刚导入的.
8.CTestView类的设计:
CP2 *P用于定义一维动态数组存储等分点,int N用于读入等分点个数,double R用于读入圆的半径,它们声明为保护数据成员.自定义公有的void成员函数Diamond(),菜单消息处理函数OnAppDiamond()
在View.h头文件中类定义前加上
#include "P2.h"//包含二维点类头文件
#include "InputDlg.h"//包含输入对话框类头文件
在View.cpp中加上
#include "stdafx.h"
#include "Test.h"
#include "TestDoc.h"
#include "TestView.h"
#define ROUND(a) int(a+0.5)//四舍五入
#include "cmath"//数学头文件
#define PI 3.1415926//圆周率的宏定义
9.加上绘制内容
void CTestView::Diamond()//绘制金刚石图案函数
{
P=new CP2[N];//动态分配内存
CClientDC dc(this);//设置客户区设备上下文
CRect Rect;//定义矩形对象
GetClientRect(&Rect); //获取客户区矩形范围
double theta;//theta为圆的等分角
theta=2*PI/N;
for(int i=0;i { P[i].x=R*cos(i*theta); P[i].y=R*sin(i*theta); } for(i=0;i<=N-2;i++)//绘制金刚石图案的外层循环 { for(int j=i+1;j<=N-1;j++)//绘制金刚石图案的内层循环 { dc.MoveTo(ROUND(P[i].x+Rect.right/2),ROUND(P[i].y+Rect.bottom/2)); dc.LineTo(ROUND(P[j].x+Rect.right/2),ROUND(P[j].y+Rect.bottom/2)); } } delete []P;//动态内存释放 } 10.void CTestView::OnAppDiamond()//金刚石菜单函数 { // TODO: Add your command handler code here CInputDlg dlg;//定义输入对话框类对象 if (dlg.DoModal()==IDOK)//调用输入对话框并判断是否单击OK按钮 { N=dlg.m_n;//输入对话框类数据成员m_n赋给CTestView类数据成员N R=dlg.m_r;//输入对话框数据成员m_r赋给CTestView类数据成员R } else return; RedrawWindow();//重绘窗口 Diamond();//金刚石菜单调用绘制金刚石图案函数 }