使用MFC编程,在窗口中一次绘制n=0~5的所有Cantor图
时间: 2023-06-19 16:07:15 浏览: 153
系统发育的概率论方法-ga∕t 1396-2017 信息安全技术 网站内容安全检查产品安全技术要求
Cantor图是一种分形图形,可以使用递归的方式来绘制。这里给出一个使用MFC编程,在窗口中一次绘制n=0~5的所有Cantor图的示例代码。
首先,需要在窗口的OnPaint函数中进行绘制。代码如下:
```
void CCantorView::OnPaint()
{
CPaintDC dc(this);
DrawCantor(dc, 0, 0, GetClientRect().Width(), 0, 5);
}
```
其中,DrawCantor是递归绘制Cantor图的函数。这个函数的代码如下:
```
void CCantorView::DrawCantor(CDC& dc, int x1, int y1, int x2, int y2, int n)
{
if (n == 0)
{
dc.MoveTo(x1, y1);
dc.LineTo(x2, y2);
}
else
{
int y = y1 + 20;
int x = (x1 + x2) / 3;
DrawCantor(dc, x1, y1, x, y, n - 1);
DrawCantor(dc, x2, y2, x, y, n - 1);
}
}
```
这个函数接收5个参数:绘制的起点和终点的坐标,以及递归的深度n。当n=0时,绘制一条线段;否则,递归绘制两个子Cantor图形,分别位于当前线段的左侧和右侧。
最后,需要在窗口的OnSize函数中进行重绘,以保证窗口大小改变时也能正确显示Cantor图形。代码如下:
```
void CCantorView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
Invalidate();
}
```
这里的Invalidate函数会触发窗口的重绘事件,从而调用OnPaint函数进行绘制。
完整的代码如下:
```
void CCantorView::OnPaint()
{
CPaintDC dc(this);
DrawCantor(dc, 0, 0, GetClientRect().Width(), 0, 5);
}
void CCantorView::DrawCantor(CDC& dc, int x1, int y1, int x2, int y2, int n)
{
if (n == 0)
{
dc.MoveTo(x1, y1);
dc.LineTo(x2, y2);
}
else
{
int y = y1 + 20;
int x = (x1 + x2) / 3;
DrawCantor(dc, x1, y1, x, y, n - 1);
DrawCantor(dc, x2, y2, x, y, n - 1);
}
}
void CCantorView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
Invalidate();
}
```
阅读全文