
图形学报告案例7.docx
6页太原工业学院计算机工程系实验报告课程名称计算机图形学班级实验日期2014年4月12日姓 名学号实验成绩实验名称金刚石图案的算法实验目的及要求1、 将半径为r的圆周n等份,然后用直线段将每一个等分点和其他所有等分 点连接,形成金刚石图案2、 使用对话框读入等分点个数和圆的半径,以屏幕客户区中心为圆心3、 会使用MFC基本绘图函数,会使用菜单或图标按钮实现绘图4、 会建立工程,会添加类实验环境VC++6.0实 验 内 容1、 程序运行界面提供“文件”、“帮助”和“图形”3个弹出菜单项文件是“退 出”子菜单,用于退出工程;帮助是“关于”子菜单,用于显示开发信息; 图形是“绘图”子菜单,用于绘制金刚石图案2、 工具栏提供与子菜单项“退出”、“绘图”、“关于”相对应的图标按钮3、 单击“绘图”子菜单或“绘图”按钮弹出输入对话框,输入圆的半径和圆 的等分点个数,单击“0K”按钮绘制金刚石图案4、 自定义屏幕坐标系,圆心位于客户区中心,X轴水平向右为正,Y轴垂直向 上为正以二维坐标系为圆心绘制半径为r的圆,将圆的n等份点使用直线 段将每一个等分点和其他所有等分点连接成金刚石图案算 法 描 述 及 实 验 步算法描述:1、 读入圆的半径r和圆的等分点个数n。
2、 根据等分点个数计算金刚石图案等分角Theta=2*PI/n3、 计算金刚石图案的起始角Alpha=PI/2-Thetao4、 将圆等分后的顶点坐标存储于数组P中5、 设计一个二重循环,代表起点的外层整型变量i从i=0循环到i=n-2的内层 整型变量j Uj=i+1循环到j=n-lo以p[i]为起点,以p[j]为终点连接各线段 构成金刚石图案步骤:1、建立工程2、添加新类CP2o在P2.h中添加成员变量x、y,在P2.cpp中添加默认构造函 数并将其初始值赋为02、 引入图标按钮,将其粘贴到Toolbar中,双击图标将其属性按照书上的填入 即可3、 单击Menu,点开其下面的选项,添加“绘图”子菜单4、 右击Dialog点插入Dialog,再选择静态文本框,分别输入圆的半径和圆的 等分点个数并为其赋值;选择编辑框双击对话框,添加新类InputDlg,点 确定建立类 向导,在 Message 点 WM_SH0WWIND0W 添加 OnShowWindow函数,在函数中加入书上的代码建立类向导,选择 CTestView,在 Object IDs 中点击 IDM DRAWPIC 添加 OnDrawpic 函数,在函数中加入代码。
5、右击Class文件中的View选择添加成员函数,加入类型void,函数Diamond 点确定,再写入代码7、 需注意在 View.cpp 文件开头中加入#include "math.h" >#define PI 3.1415926 、#define Round(d) int(floor(d+0.5))^ #include "InputDlg.h"头文件8、 在View.h中加入#include "P2.h"0最后运行调 试 过 程 及 实 验 结 果在调试过程中,出现了缺少头文件的错误,加入在步骤中出现的头文件即可还有就是有 些量没定义,在View.h中添加成员变量即可总结附录在这个案例中学会了建立工程,理解了 MFC框架的创建步骤,学会用MFC基本绘图 工具,会创建OnDrawpic函数,掌握用菜单或图标实现图形的绘制,领会一维动态数组内 存的分配和释放方法,会添加新类和成员函数1、 CP2 类P2. h 中class CP2{public:CP2O;virtual 〜CP2 ();public:double x;double y;};P2. cpp 中CP2: :CP2(){x=0;y=0;}2、 OnShowWi ndow 0void ClnputDlg::OnShowWindow(BOOL bShow, UINT nStatus){CDialog::OnShowWindow(bShow, nStatus);// TODO: Add your message handler code hereGetDlgltem(IDC_EDITl)->SetFocus();((CEdit *)GetDlgltem(IDC_EDIT1))->SetSel(0, -1);}3、 D i amond 0void CTestView::Diamond()//绘制金刚石图案函数{CDC *pDC二GetDCO ;CRect rect;GetClientRect(&rect) ; pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect. Width(), rect. Height());pDC->SetViewportExt (rect. Width (), -rect. Height ());pDC->SetViewportOrg(rect. Width()/2, rect. Height ()/2);rect. OffsetRect (-rect. Width () /2, -rect. Height ()/2);CPen NewPen, *p01dPen;NewPen. CreatePen (PS_SOLID, 1, RGB(0, 0, 255));p01dPen=pDC->Select0bject(&NewPen);double Alpha, Theta;Theta=2*PI/n;Alpha二PI/2-Theta;int i, j;for( i=0;i〈n;i++){P[i]. x=r*cos(i*Theta+Alpha);P[i]. y=r*sin(i*Theta+Alpha);}for (i=0;i<=n~2;i++){for(j=i+l;j〈=n-l;j++){pDC->MoveTo(Round(P[i]. x), Round(P[i]. y));pDC->LineTo(Round (P[j]. x), Round(P[j]. y));}}pDC->SelectObject(pOldPen);NewPen. DeleteObject();ReleaseDC(pDC);}4、OnDrawp i c 0void CTestView::OnDrawpic(){// TODO: Add your command handler code here CInputDig dig;if (IDOK二二dig. DoModal ()){n二dig. m_n; r二dig. m_r;}else return;RedrawWindow();P=new CP2[n];Diamond ();delete []P;}。












