【计算机图形学】实验一 · 绘制金刚石图案

一、实验任务

  • 定义二维坐标系原点位于屏幕中心,x轴水平向右为正,y轴铅直向上为正。
  • 以二维坐标系原点为圆心绘制半径为r的圆,将圆的n等分点使用直线彼此连接形成金刚石图案。
  • 程序运行界面提供“文件”、“绘图”和“帮助”三个弹出菜单项。“文件”菜单提供“退出”子菜单项,用于退出应用程序;“绘图”菜单提供“金刚石”子菜单项,用于绘制金刚石图案;“帮助”菜单提供“关于”子菜单项,用于说明开发信息。
  • 选择“金刚石”子菜单项,打开“输入参数”对话框,输入“等分点个数”和“圆的半径”。
  • 在屏幕客户区中心绘制金刚石图案。

二、实验环境

  •  Visual Studio 2017
  • C++ MFC

三、效果展示

Vici__

Vici__

四、核心代码


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忘干净了。

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/105557667