程序主体分为以下四个方面

1. 计算迭代次数，也就是它的发散速度。迭代次数越少，其发散速度越快。

``````int k=0;
for (; k < 1000; k++)
{
if (z.get_mod2() > 4.0)	break;
z = z * z + c;
}
``````

2. 对坐标系统进行一定的缩放来与显示区域的坐标系统相匹配.

``````c.real = real_min + x * (real_max - real_min) / disp_width;
c.imag = imag_min + y * (imag_max - imag_min) / disp_height;
``````

3. 配色

``````void InitColor()
{
// 使用 HSL 颜色模式产生角度 h1 到 h2 的渐变色
int h1 = 240, h2 = 30;
for (int i = 0; i<MAXCOLOR / 2; i++)
{
Color[i] = HSLtoRGB((float)h1, 1.0f, i * 2.0f / MAXCOLOR);
Color[MAXCOLOR - 1 - i] = HSLtoRGB((float)h2, 1.0f, i * 2.0f / MAXCOLOR);
}
}

``````

4. ppm文件的格式

``````image << "P6\n"  //PPM magic number
<< width << ' '  //width, in ASCII decimal
<< height << '\n'  //height, in ASCII decimal
<< 255<<'\n';  //maximum color value, in ASCII decimal
``````

P6格式，图象数据以字节格式存储，每个色彩成分（R，G，B）一个字节，3个字节为一个像素点。

参考代码：

``````#include<iostream>
#include<string>
#include<fstream>
using namespace std;

struct pixel  //单个像素
{
char r, g, b;
};

class Complex
{
public:
Complex(double real = 0, double imag = 0) :real(real), imag(imag){}
Complex(Complex& com) :real(com.real), imag(com.imag){}
double& operator[](int i){ return i == 0 ? real : imag; }
double get_mod2(){ return pow(real, 2) + pow(imag, 2); }
Complex& operator=(Complex& com){ real = com.real; imag = com.imag; return *this; }
Complex operator+(Complex& com){ return Complex(real + com.real, imag + com.imag); }
Complex operator*(Complex& com){ return Complex(real*com.real - imag*com.imag, real*com.imag + imag*com.real); }

private:
double real, imag;
};

class Mandelbrot
{
public:
Mandelbrot(int _width=640, int _height=480)
:path(path), width(_width), height(_height){}
~Mandelbrot(){}
public:
void set_path(string path)
{
this->path = path;
}
void draw(double from_x,double to_x,double from_y,double to_y) //图片保存路径
{
create_image();

for (int y = 0; y < height; y++)
{
Complex c(0, from_y + (to_y - from_y) * y / (double)height);
for (int x = 0; x < width; x++)
{
c[0] = from_x + (to_x - from_x) * x / (double)width;
Complex z(0, 0);
int k;
for (k = 0; k < 1000; k++)
{
if (z.get_mod2() > 4.0)	break;
z = z * z + c;
}
pixel p = { Color[k % 64].b, Color[k % 64].g,
Color[k % 64].r
};
pixel q = { 0, 0, 0 };
if (k == 1000) //收敛
{
image.write((char*)&q,sizeof(q));
}
else //发散
{
image.write((char*)&p,sizeof(p));
}
}
}
image.close();
}
void get_color(string path)
{
color.open(path,ios::binary);
for (int i = 0; i < 64; ++i)
{
}
color.close();
}
int get_fileSize(){ return height*width*sizeof(pixel) / 1024; }  //KB
private:
ofstream image;
ifstream color;
void create_image()
{
image.open(path,ios::binary);
}
{
image << "P6\n"
<< "#Mandelbrot Set\n"
<< width << ' '
<< height << '\n'
<< 255<<'\n';
}

int width, height; //图片尺寸
pixel Color[64];
string path;
};

int main()
{

Mandelbrot test;
test.set_path("Mandelbrot.ppm");
test.get_color("color.dat"); //从文件中读取颜色数据
cout << test.get_fileSize()<<"KB";
test.draw(-2.1, 1.1, -1.2, 1.2);

return 0;
}
``````

【C++】Mandelbrot集绘制(生成ppm文件)的更多相关文章

1. 广义mandelbrot集，使用python的matplotlib绘制，支持放大缩小

迭代公式的指数,使用的1+5j,这是个复数.所以是广义mandelbrot集,大家能够自行改动指数,得到其它图形.各种库安装不全的,自行想办法,能够在这个站点找到差点儿全部的python库 http: ...

2. 使用OpenGL进行Mandelbrot集的可视化

Mandelbrot集是哪一集?? Mandelbrot集不是哪一集!! 啊不对-- Mandelbrot集是哪一集!! 好像也不对-- Mandelbrot集是数集!! 所以--他不是一集而是数集? ...

3. 获得mysql内容，生成xml文件，另外，为了webservice发送

<xyt> <news id> <url></url> <title></title> </news> </x ...

4. [原创] 利用前端+php批量生成html文件，传入新文本，输出新的html文件

本人因为要想自己写个小说网站练练手,在其中遇到的一些问题,将其解决方法总结出来,例如: 1:小说网站存储了大量的小说,每个小说主页都很相似,url不同,不是使用的history属性改写的,所以如果人工 ...

5. java自动生成entity文件

网上关于自动生成entity文件的代码很多,看了很多代码后,在先辈们的基础上再完善一些功能(指定多个表,全部表). 为了使用方便所以把两个类写在一个java文件中,所以大家可以直接拿这个java文件, ...

6. Java 动态生成 PDF 文件

每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

7. spark中saveAsTextFile如何最终生成一个文件

8. Java多线程之赛跑游戏（含生成exe文件）

在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...

9. Spark中如何生成Avro文件

研究spark的目的之一就是要取代MR,目前我司MR的一个典型应用场景即为生成Avro文件,然后加载到HIVE表里,所以如何在Spark中生成Avro文件,就是必然之路了. 我本人由于对java不熟, ...

随机推荐

1. ORA-12543: TNS:destination host unreachable

在连接Oracle数据库时,如果使用Tnsnames.ora中配置的数据源名称有时会报 ORA-12543: TNS:destination host unreachable 异常,比如:在Tnsna ...

2. [PHP 作为iOS后台Json格式HTTP通信及文件上传的实现]

1.数据库连接 configmysql.php <?php \$q = mysql_connect("localhost:8889","root",&quo ...

3. mina 字节数组编解码器的写法 II

I 里面的写法不够严谨,这也是我之前说它简陋的主要原因,下面来个更加严谨.完整一点儿的: ByteArrayEncoder.java package org.bruce.mina.cpp.codec; ...

4. Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客

Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客 Canvas之动态波浪效果 (2012-04-26 09:04:51) 转载▼

5. launchMode传递参数注意startActivityForResult

Activity1 到Activity2 用startActivityForResult 如果Activity2的launchMode为 singleInstance 和 singleTask 都会启 ...

6. java-信息安全（四）-数据签名、数字证书

概述 信息安全基本概念: 数字签名 数字证书 数字签名 数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名 ...

7. 《JAVA程序设计》第13周学习总结

1. 本章学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. GET / HTTP/1.0可以返回一个HTML格式的文本页 IP地址可以用来标识网络上的主机 Socke ...

8. 轻松搞定RocketMQ入门

RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RocketMQ网络 ...

9. C#中Button.DialogResult属性

窗体中的某个按钮,如果设置了DialogResult(不是设置为None),当窗体是通过ShowDialog方法显示的时候 则不必设置任何响应函数,单击按钮也可窗体.然后,该窗体的DialogResu ...

10. SQL更新派工单数量=任务数量的

select b.FCommitQty '任务数量',a.FQty '派工数量',a.FSourceBillNo '派工单号',b.FBillNo '任务单号',a.FStatus '派工状态' fr ...