一、什么是分形图?
上面就是一个分形图,不过有点丑。这张图已经可以代表分形图的特点——边缘不规则。就算把边缘无线放大,我们看到的,还是不规则的边缘。这就是分形图的特点。
二、如何绘制分形图?
分形图当然有无数种绘制方式,我这里拿出较简单的一种来进行说明。主要是是从代码的角度来介绍下编程思路。使用的编程语言为C++,编译环境为Qt5.5.4.1.
1.编写复数类,实现运算符重载。
在本例中,需要用到复数的运算,所以需要写一个名为“idcomplex”的类,这个类包含运算符的重载。
idcomplex.h
class idComplex{
public:
idComplex(double r,double i);
idComplex();
~idComplex();
idComplex SetValue(double re,double im);
idComplex operator + (idComplex c);
idComplex operator - (idComplex c);
idComplex operator * (idComplex c);
idComplex operator += ( idComplex c );
idComplex operator -= ( idComplex c );
idComplex operator *= ( idComplex c );
double Operatmod();
void DisplayComplex();
private:
double m_real;
double m_image;
};
idcomplex.cpp
idComplex::idComplex(double r,double i){
m_real=r;
m_image=i;
}
idComplex::idComplex()
{
m_real=0.0f;
m_image=0.0f;
}
idComplex::~idComplex()
{
}
idComplex idComplex::SetValue(double re, double im)
{
m_image=im;
m_real=re;
return *this;
}
idComplex idComplex::operator +(idComplex c)
{
idComplex c1(0,0);
c1.m_real=m_real+c.m_real;
c1.m_image=m_image+c.m_image;
return c1;
}
idComplex idComplex::operator -(idComplex c)
{
idComplex c1(0,0);
c1.m_real=m_real-c.m_real;
c1.m_image=m_image-c.m_image;
return c1;
}
idComplex idComplex::operator *(idComplex c)
{
idComplex c1(0,0);
c1.m_real=m_real*c.m_real-m_image*c.m_image;
c1.m_image=m_image*c.m_real+m_real*c.m_image;
return c1;
}
idComplex idComplex::operator += (idComplex c)
{
m_real+=c.m_real;
m_image+=c.m_image;
return *this;
}
idComplex idComplex::operator -= (idComplex c)
{
m_real-=c.m_real;
m_image-=c.m_image;
return *this;
}
idComplex idComplex::operator *= ( idComplex c )
{
double a=m_real,b=m_image,m=c.m_real,n=c.m_image;
m_real=a*m-b*n;
m_image=b*m+a*n;
return *this;
}
double idComplex::Operatmod()
{
return sqrt(m_real*m_real+m_image*m_image);
}
这两个文件就实现了复数类的构建。
2.对公式进行迭代及绘图。
在上图的复数坐标系中,从如图所示的矩形框内,选取某一点,比如是c0点,令c1 = c0,然后循环这个语句20次,“c1 = c1*c1+c0”,然后判断c1的模是否小于2,小于2的点标记为1种颜色,其他的标记为另一种颜色。这样就能画出分形图。
QPainter painter(this);
QSize size = this->size();
double width = size.width()/2;
double height = size.height()/2;
double scale = 1.5;
int const max_time = 100;
for(int a=-width;a<=width;a++)
{
for(int b=-height;b<=height;b++ )
{
int times = max_time;
idComplex c0(a/width*scale,b/height*scale);
idComplex c1=c0;
while(times--)
{
c1=c1*c1+c0;
if(c1.Operatmod()>2)
break;
}
times = times<0 ? 0 : times;
int gray = 255*times/max_time;
painter.setPen(QPen(QColor(gray,gray,gray,255)));
int x=a+width;
int y=b+height;
painter.drawPoint(x,y);
}
}
绘图过程中注意坐标的转换。
三、我写的工程文件
我的电脑环境下的工程文件下载百度云地址:http://pan.baidu.com/s/1pKG9wev 如果环境一致,可以运行。