近日在网上看到一生成分形图形delphi程序,生成图形非常漂亮,所以改成了c++,并提高了生成效率.
代码如下(原来的代码使用复数运算,考虑到效率,去掉了,但仍然保留在注释中)
//此函数用来获取颜色,s在[0,1]之间,且颜色是连续的
COLORREF GetColor(double s)
{
int r,g,b;
if(s<=0.25)
{
g=int(255*s/0.25);
return RGB(0,g,255);
}
else if(s>0.25&&s<=0.5)
{
b=255-int(255*(s-0.25)/0.25);
return RGB(0,255,b);
}
else if(s>0.5&&s<=0.75)
{
r=int(255*(s-0.5)/0.25);
return RGB(r,255,0);
}
else
{
g=255-int(255*(s-0.75)/0.25);
return RGB(255,g,0);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
complex c,z;
float cr,ci,zr,zi,pr,pi;
int i,j,k;
COLORREF color[256];
for(i=0;i<256;i++)
{
color[i]=GetColor(i/256.0);
}
int cx=610,cy=511;
BYTE *data=new BYTE[cx*4*cy];
memset(data,205,cx*4*cy);
//c=complex(0.45, -0.1428);
//c=complex(-0.75, 0.0);
//c=complex(0.285, 0.0);
//c=complex(-0.8, 0.156);
//c=complex(-0.70176, -0.3842);
//c=complex(0.285, 0.01);
//改变初始值可以得到不同的效果
cr=0.285f;
ci=0.01f;
for(i=-300;i<=300;i++)
{
for(j=-255;j<=255;j++)
{
//z=complex(i/255.0f,j/255.0f);
zr=i/255.0f;
zi=j/255.0f;
for(k=0;k<=255;k++)
{
//if(sqrt(z.real()*z.real()+z.imag()*z.imag())>2.0)
if(sqrt(zr*zr+zi*zi)/2>2.0)
{
break;
}
else
{
//z=z*z+c;
pr=zr*zr-zi*zi;
pi=2.0f*zr*zi;
zr=pr+cr;
zi=pi+ci;
}
}
data[4*(cx*(cy-j-255)+i+300) ]=GetBValue(color[k]);
data[4*(cx*(cy-j-255)+i+300)+1]=GetGValue(color[k]);
data[4*(cx*(cy-j-255)+i+300)+2]=GetRValue(color[k]);
}
}
BITMAPINFO sBmpInfo;
::ZeroMemory(&sBmpInfo, sizeof(BITMAPINFO));
sBmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
sBmpInfo.bmiHeader.biWidth=cx;
sBmpInfo.bmiHeader.biHeight=cy;
sBmpInfo.bmiHeader.biBitCount=32;
sBmpInfo.bmiHeader.biPlanes=1;
sBmpInfo.bmiHeader.biCompression= BI_RGB;
sBmpInfo.bmiHeader.biSizeImage=32*cx;
StretchDIBits(pDC->m_hDC,0,00,cx,cy,0,0,cx,cy,data,&sBmpInfo,DIB_RGB_COLORS,SRCCOPY);
delete []data;
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}