曼德勃罗(Mandelbrot)集合与其编程实现
一、从科赫雪花谈起
设想一个边长为1的等边三角形(例如以下图所看到的)。取每边中间的三分之中的一个,接上去一个形状全然类似的但边长为其三分之中的一个的三角形,结果是一个六角形。如今取六角形的每个边做相同的变换,即在中间三分之中的一个接上更小的三角形,以此反复,直至无穷。
外界的变得原来越细微曲折,形状接近理想化的雪花。
这个图形的名字叫柯赫雪花。
1904年,瑞典数学家柯赫首次描写叙述了一种后来以其名字命名的曲线——柯赫曲线,而柯赫雪花就是由柯赫曲线所围成的一个封闭的图形。
柯赫雪花有非常多奇异的性质。
比如。柯赫雪花的周长趋于无穷。而柯赫雪花的面积却是有限的!此外,柯赫雪花也体现了一种(递归的)自类似性,即当把图形的局部放大。它会呈现出一种与总体(或总体的部分)之间的惊人形似性。
二、分形
虽然类似于柯赫雪花这种自类似图形早已经出现。可是真正把这些问题系统地发展成一门学问,则是在二十世纪下半页。数学家本华·曼德勃罗(Benoit B. Mandelbrot)把这些部分与总体以某种方式类似的形体称为分形(fractal)。1975年,他创立了分形几何学(Fractal Geometry)。
在此基础上。形成了研究分形性质及其应用的科学,称为分形理论(Fractal Theory)。因此,曼德勃罗也被称为“分形学之父”。如今。分形理论已经发展成为一门十分风靡和活跃的新理论、新学科,特别是把分形理论和混沌理论结合之后,更是衍生出一大片广阔的研究天地。分形的世界与我们寻常所研究的几何学中非常多直观的常识之间具有巨大的冲突。比如,寻常我们说一个几何图形的维度,那么这个维度一般都应该是整数。比如平面上一个矩形就是二维的,空间中一个球体就是三维的。可是在分析几何中。几何图形的维度都是不是整数而是分数。这个维度又称为豪斯多夫维或豪斯多夫-贝塞科维奇维(Hausdorff-Becikovich Dimesion),它是由数学家豪斯多夫于1918年引入的。
通过豪斯多夫维能够给一个随意复杂的点集合比方分形赋予一个维度。
三、曼德勃罗集合(Mandelbrot Set)
曼德勃罗集合(Mandelbrot Set)或曼德勃罗复数集合。是一种在复平面上组成分形的点的集合,因由曼德勃罗提出而得名。曼德博集合能够使复二次多项式 进行迭代来获得。
当中,c是一个复參数。对于每个c。从 z = 0 開始对fc(z)进行迭代。序列 的值或者延伸到无限大,或者仅仅停留在有限半径的圆盘内(这与不同的參数c有关)。曼德布洛特集合就是使以上序列不延伸至无限大的全部c点的集合。
最后。我们给出一个利用C语言生成Mandelbrot集合并绘制图形的程序(该程序来自文献【1】):
#include <stdio.h>
#include <stdlib.h>
#include <complex.h> #define width_size 800
#define height_size 600
#define Maxval 255 static const float orig_x = width_size * 2/3;
static const float orig_y = height_size * 1/2; typedef struct _pixel {
unsigned char r;
unsigned char g;
unsigned char b;
} pixel; static const pixel dim_gray = { 105, 105, 105 }; static unsigned char iteration(int x, int y)
{
const int limit = Maxval + 1;
int i;
complex c = ((x - orig_x) / (width_size / 3)) +
((orig_y - y) / (height_size / 2)) * I;
complex z = 0; for (i = 0; i < limit; i++) {
/* basic formula */
z = z * z + c;
if (creal(z) > 2 || cimag(z) > 2)
break;
}
return (unsigned char) (i == limit ? 0 : i);
} int main()
{
FILE *f = fopen("mandelbrot.ppm", "w+"); /* PPM header */
fprintf(f,
"P6\n" /* PPM magic number */
"#Mandelbrot Set\n"
"%d " /* width, in ASCII decimal */
"%d\n" /* height, in ASCII decimal */
"%d\n", /* maximum color value, in ASCII decimal */
width_size, height_size, Maxval); /* Write every pixel generated by Mandelbrot Set */
for (int i = 0; i < height_size; i++) {
for (int j = 0; j < width_size; j++) {
unsigned char iter = iteration(j, i);
if (iter) {
pixel p = {
.r = iter,
.g = (float) abs(j - orig_x) / width_size * Maxval,
.b = (float) abs(i - orig_y) / height_size * Maxval };
fwrite(&p, sizeof(pixel), 1, f);
} else {
fwrite(&dim_gray, sizeof(pixel), 1, f);
}
}
} fclose(f);
return 0;
}
上述程序所生成的图像结果例如以下图所看到的,须要补充说明的是:该图像文件格式为ppm,在Windows下你能够使用Photoshop来查看这种类型的图像文件,在OS X系统下你能够使用免费的GIMP软件来查看它。
參考文献:
【1】http://blog.linux.org.tw/~jserv/archives/2011/09/_mandelbrot_set.html
曼德勃罗(Mandelbrot)集合与其编程实现的更多相关文章
- OpenACC 绘制曼德勃罗集
▶ 书上第四章,用一系列步骤优化曼德勃罗集的计算过程. ● 代码 // constants.h ; ; ; ; const double xmin=-1.7; ; const double ymin= ...
- OpenMP并行化实例----Mandelbrot集合并行化计算
在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的 ...
- Mandelbrot集合及其渲染
什么是Mandelbrot集合? Mandelbrot集合是在复数平面上组成分形的点的集合,它正是以数学家Mandelbrot命名. Mandelbrot集合可以用复二次多项式 \[ f_c(z)=z ...
- Python matplotlib numpy 曼德尔布罗特集合 曼德尔布罗特 B.Madelbrot
import numpy as np import matplotlib.pyplot as plt def mandelbrot(h,w,maxit=20): y,x = np.ogrid[-1.4 ...
- 把List<string>集合,编程string,并以“,”号分割
List<int> roleIdList = GetRoleIdList(user.ID); string roleIdsStr = ""; if (roleIdLis ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】
转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...
- 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...
- 机器学习(Machine Learning)&深度学习(Deep Learning)资料(下)
转载:http://www.jianshu.com/p/b73b6953e849 该资源的github地址:Qix <Statistical foundations of machine lea ...
随机推荐
- BZOJ2157: 旅游(LCT)
Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...
- 51NOD——T 1079 中国剩余定理
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难 ...
- 洛谷 P1327 数列排序
P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...
- 洛谷 P1416 攻击火星
P1416 攻击火星 题目描述 一群外星人将要攻击火星. 火星的地图是一个n个点的无向图.这伙外星人将按照如下方法入侵,先攻击度为0的点(相当于从图中删除掉它),然后是度为1的点,依此类推直到度为n- ...
- Activity Test1
源代码下载(免积分) :下载 Acitivty測试的API的父类是InstrumentationTestCase.这个类可以获取Instrumentation.来操作Activity. 对于acti ...
- Spring MVC学习总结(1)——Spring MVC单元测试
关于spring MVC单元测试常规的方法则是启动WEB服务器,测试出错 ,停掉WEB 改代码,重启WEB,测试,大量的时间都浪费在WEB服务器的启动上,下面介绍个实用的方法,spring MVC单元 ...
- UvaLive 6663 Count the Regions 离散化+DFS
链接:http://vjudge.net/problem/viewProblem.action?id=49408 题意:在平面内给出若干个矩形,求出它们能将整个平面分成多少份. 思路:刚開始一眼看到认 ...
- C#学习笔记——常量、字段以及事件
一 常量与字段 (一) 常量 常量总是被视为静态成员,而不是实例成员.定义常量将导致创建元数据.代码引用一个常量时,编译器会在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入IL中.由于 ...
- vagrant 的安装与使用
1. 安装 ubuntu 安装vagrant过程 ubuntu 安装 vagrant 时需要首先安装 virtualbox: (1)下载安装与当前 ubuntu 版本相适应的 virtualbox 安 ...
- TableView相关属性
//是否要显示分隔线 tableView.separatorStyle = UITableViewCellSeparatorStyleNone; tableView.separatorStyle = ...