用Qt绘制一张分形图

来源:互联网 发布:韩国美女直播软件app 编辑:程序博客网 时间:2024/06/10 22:37

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、什么是分形图?</span>


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

二、如何绘制分形图?

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


0 0
原创粉丝点击