曼德布洛特集合
highflybird
- 登录 发表评论
曼德布洛特复数集合可以用复二次多项式来定义:$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;
}
图像