一、实验任务
- 定义二维坐标系原点位于屏幕中心,x轴水平向右为正,y轴铅直向上为正。
- 以二维坐标系原点为圆心绘制半径为r的圆,将圆的n等分点使用直线彼此连接形成金刚石图案。
- 程序运行界面提供“文件”、“绘图”和“帮助”三个弹出菜单项。“文件”菜单提供“退出”子菜单项,用于退出应用程序;“绘图”菜单提供“金刚石”子菜单项,用于绘制金刚石图案;“帮助”菜单提供“关于”子菜单项,用于说明开发信息。
- 选择“金刚石”子菜单项,打开“输入参数”对话框,输入“等分点个数”和“圆的半径”。
- 在屏幕客户区中心绘制金刚石图案。
二、实验环境
- Visual Studio 2017
- C++ MFC
三、效果展示
四、核心代码
void CExp1DrawDiamondsView::OnDiamond()
{
CInputDlg dlg;
if (dlg.DoModal() == IDOK) //判断是否点击确认键
{
// 获取输入的参数(分点数n,半径r)
n = dlg.m_n;
r = dlg.m_r;
}
else { return; }
//Invalidate(FALSE); //若为TRUE,则是新画布画图;若为FALSE,则是追加画图
CDC* pDC = GetDC();
CRect rect; //定义矩形对象
GetClientRect(&rect);//获取客户区矩形大小
pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系
pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口比例
pDC->SetViewportExt(rect.Width(), rect.Height());//设置视区比例且y轴向上
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//设置客户区中心为坐标原点
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//矩形与客户区重合
CPen newPen, *poldPen;//定义画笔
newPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 225));
poldPen = pDC->SelectObject(&newPen);
P = new CMyPoint[n];
double theta = 2 * PI / n;
for (int i = 0; i < n; i++)
{
// 极坐标系转为直角坐标系
P[i].x = r * cos(i*theta);
P[i].y = r * sin(i*theta);
}
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
pDC->MoveTo(int(P[i].x), int(P[i].y)); // MoveTo() 设置起点
pDC->LineTo(int(P[j].x), int(P[j].y)); // LineTo() 设置终点,并画线
}
}
pDC->SelectObject(poldPen);
newPen.DeleteObject();
ReleaseDC(pDC);
}
五、后记
真正麻烦的不是绘图,而是对话框。。。MFC忘干净了。