用Qt绘制一张分形图

一、什么是分形图?


上面就是一个分形图,不过有点丑。这张图已经可以代表分形图的特点——边缘不规则。就算把边缘无线放大,我们看到的,还是不规则的边缘。这就是分形图的特点。

二、如何绘制分形图?

分形图当然有无数种绘制方式,我这里拿出较简单的一种来进行说明。主要是是从代码的角度来介绍下编程思路。使用的编程语言为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 如果环境一致,可以运行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值