MFC在屏幕的中间绘制如图所示的正五边形与正五角星的嵌套结构。试取递归深度n为4,请编写递归函数

OnDraw

	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);

	int r = 200, n = 5, k = 0, j = 4;//r为初始最大的分割圆半径,j为交互传	入的递归次数
	double PI = 3.14159;
	CPoint P[5];//5等分圆得到五个顶点
	double Theta = 2 * PI / n;
	double Alta = PI / 10;
	double Ethta = PI / 5;
	double lr = 1 / (cos(Ethta) * cos(Ethta) * 4);每次递归分割圆的缩小比例
	CPen greenPen, bluePen, * pOldPen;
	greenPen.CreatePen(0, 1, RGB(0, 255, 0));
	bluePen.CreatePen(0, 1, RGB(0, 0, 255));
	while (k < j)
	{
		for (int i = 0; i < n; i++) {
			P[i].x = round(r  * cos(i * Theta + Alta * (1+k*2)));
			P[i].y = round(r  * sin(i * Theta + Alta * (1+k*2)));
		}
		pOldPen = pDC->SelectObject(&greenPen);
		for (int i = 0; i < n; i++)
		{
			pDC->MoveTo(P[i]);
			pDC->LineTo(P[(i + 2) % 5]);//隔点绘制五角星
		}
		pDC->SelectObject(pOldPen);

		pOldPen = pDC->SelectObject(&bluePen);
		for (int i = 0; i < n; i++)
		{
			pDC->MoveTo(P[i]);
			pDC->LineTo(P[(i + 1) % 5]);//连续点绘制正五边形
		}
		pDC->SelectObject(pOldPen);
		r = r * lr;
		k++;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值