跳转到主要内容

曼德布洛特集合

主标签

曼德布洛特复数集合可以用复二次多项式来定义:$f_c(Z)=Z^2+C$
其中$C$是一个复数参数。
从$Z=0$开始对$f_c(Z)$进行迭代:
$Z_{n+1}=Z_n^2+C,n=0,1,2,... $
$Z_0=0.$
$Z_1=Z_0^2+C=C.$
$Z_2=Z_1^2+C=C.$
$...$
每次迭代的值依序如以下数列所示:
$(0,f_c(0),f_c(f_c(0)),f_c(f_c(f_c(0))),...).$
不同的参数$c$可能使迭代值的模逐渐发散到无限大,也可能收敛在有限的区域内。
曼德布洛特集合$M$就是使其不扩散的所有复数的集合。

下面代码可以实现画出其图像:

void Drawer::DrawMandel(HDC hdc)
{
	if (!redraw)
	{
		BitBlt(hdc, m_rect.left, m_rect.top, m_rect.right-m_rect.left,\
		m_rect.bottom-m_rect.top, m_hdc, 0, 0,SRCCOPY);
		return;
	}
	PQTYPE x=0.0, y=0.0,r=0.0,dp,dq,p,q,x0,y0;
	int i=m_rect.left, j=m_rect.top, k=0,i1=0,j1=0, i2=0,j2=0;

	dp = (pq.pmax - pq.pmin)/(m_rect.right-m_rect.left);
	dq = (pq.qmax - pq.qmin)/(m_rect.bottom-m_rect.top);

	for(i1=0; i<m_rect.right; i++,i1++)
	{
	
		p = pq.pmin + dp*i1;
		for(j1=0,j = m_rect.top; j<m_rect.bottom; j++,j1++)
		{
			x0 = y0 = 0.0;
		
			q = pq.qmin + dq*j1;

			for(k=0; k<m_times; k++)
			{
			
				x = x0*x0 - y0*y0 + p;
				y = 2*x0*y0 + q;
				r = x*x + y*y;
                x0=x;y0=y;
				if (r > m_deep)
					break;
			}
			if (k >= m_times) k = r*100;
			k *= 0x1111ff;
		

			SetPixelV(hdc, i, j, k);
		

			SetPixelV(m_hdc, (i-m_rect.left), (j-m_rect.top), k);
		}
	}
	redraw = false;
}
图像
Mandelbrot-01