分形图形的生成(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
}
代码如下(原来的代码使用复数运算,考虑到效率,去掉了,但仍然保留在注释中)
//此函数用来获取颜色,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
}
- 分形图形的生成(C++)
- 基于规则的分形图形生成方法
- 分形图形简介
- C和OpenGL结合生成钻石图形的解决方案
- 趣图:分形图形之海岸线 无限放大的图片
- 分形图形:千伏高压下的湿木板
- 魏尔斯特拉斯函数与分形图形的动画演示
- 魏尔斯特拉斯函数与分形图形的动画演示
- C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
- 生成能动的图形
- 基本图形的生成
- 生成透明的图形
- 基于分形的山脉河流生成
- 简单的D0L-系统生成分形
- 分形图形 --- 龙形曲线
- UIGraphicsBeginImageContextWithOptions--生成透明的图形
- 随机生成不同的图形
- 随机生成不同的图形
- 谈谈javascript的面向对象
- mplayer快捷键
- 一个老程序员的心里话--中国程序员之现状
- [英语歌曲] 理想中的完美女人:Every woman in the world
- 如何配置一个安全稳定的SQL SERVER的数据库.txt[转]
- 分形图形的生成(C++)
- vml 入门学习
- [大发现] pdf又多一个阅读器
- CodeSmith基础(二)
- 坚决贯彻2008新观念
- 绝对可以逗MM开心的短信
- CodeSmith基础(三)
- VB写注册表
- linux kernel 2.6.23 新的调度程序CFS