用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
- 用Qt绘制一张分形图
- 用Qt绘制柱状图
- 用Qt自动绘制路口
- Qt 生成一张图片
- Qt-Quick中设置组件风格、显示一张图片、在一行显示多张图片的方法、绘制图片方法...
- 用Qt加载一张图片----定时旋转图片
- opencv+QT 读取一张图片
- 【学习笔记】cocos2d 如何绘制一张图片
- 如何绘制一张简单的html表格
- Qt paintEvent绘制窗体
- 【转】Qt绘制坐标轴
- QT绘制椭圆
- QT 图形绘制
- Qt绘制2d
- Qt绘制图形
- QT文字绘制
- QT绘制半透明窗体
- QT 绘制事件 PaintEvent
- 多语言开发
- js元素获取
- Java面试100问
- Android Canvas.drawText方法中的坐标参数的正确解释
- HTML5基础与Meta http-equiv属性详解
- 用Qt绘制一张分形图
- 2016 Al-Baath University Training Camp Contest-1
- 困扰一周多的问题总算解决了
- 分类战车SVM全系列
- 手机号中间几位为*号
- Android最好看的圆形进度条ProgressBar
- iOS学习(三十二)简单的登陆界面保存用户名到home,下次启动并显示出来
- nginx之负载均衡
- "Python"学习笔记----装饰器