分形图形的生成(C++)

来源:互联网 发布:我的室友是狐仙网络剧 编辑:程序博客网 时间:2024/04/30 21:36
 近日在网上看到一生成分形图形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<float> 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<float>(0.45, -0.1428);
    //c=complex<float>(-0.75, 0.0);
    //c=complex<float>(0.285, 0.0);
    //c=complex<float>(-0.8, 0.156);
    //c=complex<float>(-0.70176, -0.3842);
    //c=complex<float>(0.285, 0.01);
    //改变初始值可以得到不同的效果
    cr=0.285f;
    ci=0.01f;
    for(i=-300;i<=300;i++)
    {
        for(j=-255;j<=255;j++)
        {
            //z=complex<float>(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
}