分形图程序
计算机图形学 分形图的生成

实验六分形图的生成班级 08信计学号60姓名杨平萍分数一、实验目的和要求:1、掌握分形基本原理2、熟悉分形的计算机模拟算法3、上机操作迭代函数系统算法4、编译并执行谢宾斯基(Sierpinski)三角形二、实验内容:1、编程实现分形的迭代函数系统算法,并输出图形;2、编译曼德布洛特集和可放大的曼德布洛特集。
.三、编程并实现Mandelbrot Set (曼德布洛特集)的运行程序:#include <graphics.h>#include <conio.h>struct COMPLEX{double re;double im;};COMPLEX operator * (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re * b.re - a.im * b.im;c.im = a.im * b.re + a.re * b.im;return c;}COMPLEX operator + (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re + b.re;c.im = a.im + b.im;return c;}void main(){initgraph(640, 480);COMPLEX z, c;int x, y, k; // 定义循环变量for(x = 0; x < 640; x++){c.re = -2.1 + (1.1 - -2.1) * (x / 640.0);for(y = 0; y < 480; y++){c.im = -1.2 + (1.2 - -1.2) * (y / 480.0);z.re = z.im = 0;for(k = 0; k < 180; k++){if ( z.re * z.re + z.im * z.im > 4.0 ) break;z = z * z + c;}putpixel(x, y, (k >= 180) ? 0 : HSLtoRGB((float)((k << 5) % 360), 1.0, 0.5));}}getch();closegraph();}程序截图可以无穷放大的Mandelbrot Set (曼德布洛特集)的运行程序:#include <graphics.h>#include <conio.h>#define ITERATIONS 1000#define MAXCOLOR 64struct COMPLEX{double re;double im;};COMPLEX operator * (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re * b.re - a.im * b.im;c.im = a.im * b.re + a.re * b.im;return c;}COMPLEX operator + (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re + b.re;c.im = a.im + b.im;return c;}int Color[MAXCOLOR];void InitColor(){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);}}void Draw(double fromx, double fromy, double tox, double toy){COMPLEX z, c;int x, y, k;for(x = 0; x < 640; x++){c.re = fromx + (tox - fromx) * (x / 640.0);for(y = 0; y < 480; y++){c.im = fromy + (toy - fromy) * (y / 480.0);z.re = z.im = 0;for(k = 0; k < ITERATIONS; k++){if ( z.re * z.re + z.im * z.im > 4.0 ) break;z = z * z + c;}putpixel(x, y, (k >= ITERATIONS) ? 0 : Color[k % MAXCOLOR]);}}}void main(){initgraph(640, 480);InitColor();double fromx, fromy, tox, toy;fromx = -2.1; tox = 1.1;fromy = -1.2; toy = 1.2;Draw(fromx, fromy, tox, toy);MOUSEMSG m;bool isLDown = false;int selfx, selfy, seltx, selty;while(!kbhit()){m = GetMouseMsg();switch(m.uMsg){case WM_MBUTTONUP:fromx = -2.1; tox = 1.1;fromy = -1.2; toy = 1.2;Draw(fromx, fromy, tox, toy);break;case WM_MOUSEMOVE:if (isLDown){rectangle(selfx, selfy, seltx, selty);seltx = m.x;selty = m.y;rectangle(selfx, selfy, seltx, selty);}break;case WM_LBUTTONDOWN:setcolor(WHITE);setwritemode(R2_XORPEN);isLDown = true;selfx = seltx = m.x;selfy = selty = m.y;rectangle(selfx, selfy, seltx, selty);break;case WM_LBUTTONUP:rectangle(selfx, selfy, seltx, selty);setwritemode(R2_COPYPEN);isLDown = false;seltx = m.x;selty = m.y;if (selfx == seltx || selfy == selty) break;int tmp;if (selfx > seltx) {tmp = selfx; selfx = seltx; seltx = tmp;}if (selfy > selty) {tmp = selfy; selfy = selty; selty = tmp;}if ( (seltx - selfx) * 0.75 < (selty - selfy) ){selty += (3 - (selty - selfy) % 3);selfx -= (selty - selfy) / 3 * 4 / 2 - (seltx - selfx) / 2;seltx = selfx + (selty - selfy) / 3 * 4;}else{seltx += (4 - (seltx - selfx) % 4);selfy -= (seltx - selfx) * 3 / 4 / 2 - (selty - selfy ) / 2;selty = selfy + (seltx - selfx ) * 3 / 4;}double f, t;f = fromx + (tox - fromx) * selfx / 640;t = fromx + (tox - fromx) * seltx / 640;fromx = f;tox = t;f = fromy + (toy - fromy) * selfy / 480;t = fromy + (toy - fromy) * selty / 480;fromy = f;toy = t;Draw(fromx, fromy, tox, toy);break;}}getch();closegraph();}程序截图:四、实验结果分析分形的对称性即表现了传统几何的上下、左右及中心对称。
多重分形谱程序

多重分形谱程序是一种用于分析复杂数据集的算法,它可以用来描述数据集中的不同尺度的结构和特征。
这种算法能够处理不同尺度上的变化和复杂性,并提供了一种有效的方式来描述和比较不同数据集的相似性和差异性。
多重分形谱程序的基本原理是通过计算数据集中不同尺度的子集的分布情况,来提取出数据集中的多重分形特征。
具体来说,它通过将数据集分成若干个子集,并计算每个子集的分布情况,然后利用这些分布情况来计算多重分形谱。
多重分形谱程序在许多领域都有广泛的应用,包括物理、生物学、医学、地理学和经济学等。
它可以用于描述各种复杂系统的结构和行为,例如股票市场的波动、地震活动的分布、人类语言的使用情况等。
要实现多重分形谱程序,需要编写相应的程序代码。
具体的实现方式可能会因不同的编程语言和工具而有所不同,但基本的思路是相似的。
一般来说,实现多重分形谱程序需要以下几个步骤:1.定义数据集:首先需要定义要分析的数据集,可以是数字、文本、图像等各种形式的数据。
2.分割数据集:将数据集分成若干个子集,每个子集包含一定数量的数据点。
子集的划分方式可以根据具体情况而定,例如可以按照大小、时间等维度进行划分。
3.计算子集的分布情况:对于每个子集,可以计算其分布情况,例如频率、概率等。
具体的计算方法可以根据数据类型和问题背景而定。
4.计算多重分形谱:利用子集的分布情况,可以计算出多重分形谱。
多重分形谱是一种描述数据集中不同尺度上的结构和特征的数学工具,可以通过特定的公式进行计算。
5.分析结果:根据计算出的多重分形谱,可以对数据集进行深入的分析和比较,例如寻找相似性和差异性、预测未来的趋势等。
总的来说,多重分形谱程序是一种强大的算法,可以用于处理和分析各种复杂的数据集。
但是,由于它涉及到一些数学和计算方面的知识,因此需要一定的专业背景和技能来理解和实现。
图形学实验一 三维分形(附源代码)

实验报告实验名称:三维分形算法姓名:陈怡东学号:09008406程序使用说明:程序打开后会呈现出3次分形后的四面体,因为考虑到观察效果的清晰所以就用了3次分形作为演示。
与用户的交互:1键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色。
按下字母c(不区别大小写)可以改变视图函数,这里循环切换3种视图函数:glOrtho,glFrustum,gluPerspective,但是改变视图函数后要窗口形状变化后才能显现出来按下字母键q(不区别大小写)可以退出程序2鼠标交互:打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果。
鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案。
改变视图函数也是上述的3种函数,这里的效果立刻显现,但是还有很多问题达不到所要的效果,希望老师能帮忙解决一下。
设计思路:分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。
仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。
这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。
交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。
鼠标交互:通过对鼠标左右按键的实现:该部分只做了必要的介绍,具体实现见代码(附注释)分形算法:void tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。
以区别开来,函数的实现细节见代码,有注释介绍。
void triangle3(GLfloat *a,GLfloat *b,GLfloat *c)函数用来绘制每个平面细分后的三角形。
其中顶点设置为3维坐标glVertex3fv(a);void divide_tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d,int m)细分四面体的函数实现。
分形图形与分形的产生

分形图形分形理论是非线性科学的主要分支之一,它在计算机科学、化学、生物学、天文学、地理学等众多自然科学和经济学等社会科学中都有广泛的应用。
分形的基本特征是具有标度不变性。
其研究的图形是非常不规则和不光滑的已失去了通常的几何对称性;但是,在不同的尺度下进行观测时,分形几何学却具有尺度上的对称性,或称标度不变性。
研究图形在标度变换群作用下不变性质和不变量对计算机图形技术的发展有重大的意义。
说到分形(fractal),先来看看分形的定义。
分形这个词最早是分形的创始人曼德尔布诺特提来的,他给分形下的定义就是:一个集合形状,可以细分为若干部分,而每一部分都是整体的精确或不精确的相似形。
分形这个词也是他创造的,含有“不规则”和“支离破碎”的意思。
分形的概念出现很早,从十九世纪末维尔斯特拉斯构造的处处连续但处处不可微的函数,到上个世纪初的康托三分集,科赫曲线和谢尔宾斯基海绵。
但是分形作为一个独立的学科被人开始研究,是一直到七十年代曼德尔布诺特提出分形的概念开始。
而一直到八十年代,对于分形的研究才真正被大家所关注。
分形通常跟分数维,自相似,自组织,非线性系统,混沌等联系起来出现。
它是数学的一个分支。
我之前说过很多次,数学就是美。
而分形的美,更能够被大众所接受,因为它可以通过图形化的方式表达出来。
而更由于它美的直观性,被很多艺术家索青睐。
分形在自然界里面也经常可以看到,最多被举出来当作分形的例子,就是海岸线,源自于曼德尔布诺特的著名论文《英国的海岸线有多长》。
而在生物界,分形的例子也比比皆是。
近20年来,分形的研究受到非常广泛的重视,其原因在于分形既有深刻的理论意义,又有巨大的实用价值。
分形向人们展示了一类具有标度不变对称性的新世界,吸引着人们寻求其中可能存在着的新规律和新特征;分形提供了描述自然形态的几何学方法,使得在计算机上可以从少量数据出发,对复杂的自然景物进行逼真的模拟,并启发人们利用分形技术对信息作大幅度的数据压缩。
牛顿迭代分形

牛顿迭代分形牛顿迭代分形,也被称为牛顿分形或牛顿法则,是一种基于数学原理的图像生成算法。
它利用牛顿迭代的思想和复数运算,通过不断迭代计算,可以生成一幅幅美丽而神奇的分形图形。
牛顿迭代分形的生成过程可以简单描述如下:首先,选择一个复数作为初始值,然后通过不断迭代计算来寻找该复数的根。
根据牛顿迭代法的原理,我们可以得到下一个近似根的值,然后再将该值作为新的初始值进行迭代计算,直到达到预设的迭代次数或者满足停止条件。
最终,我们可以将迭代过程中的所有值映射到一个二维平面上,从而生成一张牛顿迭代分形图。
牛顿迭代分形的生成过程中,不同的初始值会产生不同的分形图形。
在分形图中,我们可以看到许多迭代过程中的轨迹,这些轨迹形成了分形的结构。
分形通常具有自相似性,即无论观察整个图像还是它的一部分,都会发现相似的形态或图案。
牛顿迭代分形在数学研究、计算机图形学、艺术创作等领域都有广泛的应用。
它不仅可以帮助我们理解复数和迭代的概念,还可以产生出许多美丽而复杂的图像。
这些图像不仅能够为我们提供视觉上的享受,还可以激发我们对数学和艺术的兴趣。
通过牛顿迭代分形的创作过程,我们可以感受到数学的魅力和无穷的可能性。
每一次的迭代计算,都是在数学的世界中进行探索和发现。
而每一张生成的分形图像,都是对数学美的一次呈现和诠释。
当我们深入探索牛顿迭代分形时,我们会发现其中隐藏着无限的奥秘和惊喜。
这些分形图像不仅令人惊叹,还能够启发我们对数学和艺术的思考。
通过创作和欣赏牛顿迭代分形,我们可以感受到数学的美妙和艺术的魅力,同时也能够培养我们的创造力和思维能力。
牛顿迭代分形是一种令人着迷的图像生成算法。
它不仅展示了数学的美丽和复杂性,还激发了我们对数学和艺术的兴趣。
通过创作和欣赏牛顿迭代分形,我们可以感受到数学的魅力和艺术的魔力,同时也能够培养我们的创造力和思维能力。
让我们一起沉浸在牛顿迭代分形的世界中,探索数学与艺术的交汇之处!。
Koch分形雪花图的面积计算

Koch 分形雪花图的面积计算一、问题叙述分形几何图形最基本的特征是自相似性,这种自相似性是指局部与整体在形态、功能、信息、时间、空间等方面具有统计意义上的相似。
在具有自相似性的图形中,图形局部只是整体的缩影,而整体图形则是局部的放大。
而本文我们要分析的是Koch 分形雪花图,包含以下三个问题:1.描述Koch 分形雪花2.证明Koch 分形雪花图K n 的边数为n 1L 34n -=⨯3.求Koch 分形雪花图的面积(数据),求n n lim Area(K )→∞二、问题分析在分析Koch 分形雪花图之前,我们首先介绍Koch 分形曲线。
Koch 分形曲线的绘制原理是:从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成四条线段的折线,如图2.1所示:图2.1 对一条线段进行第一次Koch 分形然后,对形成的四条直线段的每一条的中间的三分之一部分用等边三角形的两边代替,形成十六条线段的折线。
这种迭代继续进行下去可以形成Koch 分形曲线。
在迭代过程中,图形中的点数将越来越多,而曲线的最终显示细节的多少将取决于迭代次数和显示系统的分辨率。
设P1和P2分别是原始的两个端点,现在需要在直线段的中间依次插入点Q1,Q2,Q3以产生第一次迭代图形。
显然,Q1位于P1右端直线段的三分之一处,Q3位于P1点右端直线段的三分之二处,而Q2点的位置可以看作由Q3绕Q1逆时针旋转60度而得到的,故可以处理Q Q 13经过正交变换而得到Q Q 12。
算法如下:(1)Q1P1+P P Q P1+P P /3;←←(2-1)/3;32(2-1)(2)T Q2Q1+Q3-Q A ←⨯(1); (3)P5P2P2Q1P3Q P Q3←←←←;;2;4。
在算法中,用正交矩阵A 构造正交变换,其功能作用是对向量作旋转,使之成为长度不变的另一向量。
在绘制Koch 曲线的过程中,取旋转的角度为3π,则正交矩阵A 应取为:cos()sin()33A=sin()cos()33ππππ⎛⎫- ⎪⎪ ⎪ ⎪⎝⎭ 1.Koch 分形雪花的描述Koch 分形雪花的原始图形是等边三角形,它是由三条相等的线段围成的三角形。
分形工艺 north

分形工艺 north分形工艺(North)是一种美学和技术的混合体,借助计算机制造出复杂而美丽的分形物品。
它通过将自相似的图案无限缩放,使人们惊叹于其非凡的风格和精细的细节。
这种工艺的演变始于20世纪60年代,但直到近年来才普及,因为计算机的不断发展和艺术家的创意。
本文将介绍分形工艺的基本概念和发展历程、工艺过程和流程,以及它在当今世界中的应用和前景。
分形工艺的概念和发展历程分形是一种几何形状,它的非凡特点是具有自相似性,即一部分的形状和整体的形状可以无限重复。
分形的发现者是法国数学家曼德博,他在1961年发表了一篇论文,该论文中提到了著名的曼德博集(Mandelbrot set),这是一个非常有趣的数学对象,它由简单规则生成,却有着复杂的形态和较为难以想象的结构。
在随后的几十年里,许多数学家、物理学家、艺术家和程序员都对分形进行了研究,探索这种美丽而神秘的几何形态和其它潜在的应用。
50年代末,CG技术日益成熟,越来越多的艺术家、设计师和工程师开始借助计算机进行数字制图、数字造型和可视化设计。
分形也融入了计算机艺术的圈子,为艺术家提供了新的工具和创意的空间。
20世纪80年代,分形成为数字图形学领域的一个热门话题,在计算机游戏、电影特效、虚拟现实等领域得到广泛应用。
同时,分形也启发了很多艺术家,如吉姆.布莱德、肯.希里卡、罗伯特.康迪迪、约翰.S.霍普金斯等,他们的作品被称为“分形艺术”,并且在艺术界和科学界获得了重要的地位。
1990年代与21世纪前十年是计算机技术和软件的迅猛发展时期,图形处理、三维建模、数字雕塑等技术已经非常成熟,艺术家有了更高妙的灵感和更多的创造力。
与此同时,分形艺术也不断创新,分形图案的生成、转化、模拟、渲染等方面也得到了更多精细的处理。
分形工艺在这些前提下被发掘而广为人知,其优美繁复的图案和科学技术的共同融合,让人们感觉到一种宏伟的视觉冲击,也极大的拓宽了人类的想象空间。
曼德勃罗集合分形图案

曼德勃罗集合分形图案三、曼德勃罗集合(Mandelbrot Set)曼德勃罗集合(Mandelbrot Set)或曼德勃罗复数集合,是⼀种在复平⾯上组成分形的点的集合,因由曼德勃罗提出⽽得名。
曼德博集合可以使复⼆次多项式进⾏迭代来获得。
其中,c是⼀个复参数。
对于每⼀个c,从z = 0 开始对f c(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 255static const float orig_x = width_size * 2/3;static const float orig_y = height_size * 1/2;static const pixel dim_gray = { 105, 105, 105 };typedef struct _pixel {unsigned char r;unsigned char g;unsigned char b;} pixel;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);return0;}上述程序所⽣成的图像结果如下图所⽰,需要补充说明的是:该图像⽂件格式为ppm,在Windows下你可以使⽤Photoshop 来查看这种类型的图像⽂件,在OS X系统下你可以使⽤免费的GIMP软件来查看它。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)Koch曲线程序koch.mfunction koch(a1,b1,a2,b2,n)%koch(0,0,9,0,3)%a1,b1,a2,b2为初始线段两端点坐标,n为迭代次数a1=0;b1=0;a2=9;b2=0;n=3;%第i-1次迭代时由各条线段产生的新四条线段的五点横、纵坐标存储在数组A、B中[A,B]=sub_koch1(a1,b1,a2,b2);for i=1:nfor j=1:length(A)/5;w=sub_koch2(A(1+5*(j-1):5*j),B(1+5*(j-1):5*j));for k=1:4[AA(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5),BB(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5)]=sub_koch1(w(k,1),w(k,2),w(k,3),w(k,4));endendA=AA;B=BB;endplot(A,B)hold onaxis equal%由以(ax,ay),(bx,by)为端点的线段生成新的中间三点坐标并把这五点横、纵坐标依次分别存%储在数组A,B中function [A,B]=sub_koch1(ax,ay,bx,by)cx=ax+(bx-ax)/3;cy=ay+(by-ay)/3;ex=bx-(bx-ax)/3;ey=by-(by-ay)/3;L=sqrt((ex-cx).^2+(ey-cy).^2);alpha=atan((ey-cy)./(ex-cx));if (ex-cx)<0alpha=alpha+pi;enddx=cx+cos(alpha+pi/3)*L;dy=cy+sin(alpha+pi/3)*L;A=[ax,cx,dx,ex,bx];B=[ay,cy,dy,ey,by];%把由函数sub_koch1生成的五点横、纵坐标A,B顺次划分为四组,分别对应四条折线段中%每条线段两端点的坐标,并依次分别存储在4*4阶矩阵k中,k中第i(i=1,2,3,4)行数字代表第%i条线段两端点的坐标function w=sub_koch2(A,B)a11=A(1);b11=B(1);a12=A(2);b12=B(2);a21=A(2);b21=B(2);a22=A(3);b22=B(3);a31=A(3);b31=B(3);a32=A(4);b32=B(4);a41=A(4);b41=B(4);a42=A(5);b42=B(5);w=[a11,b11,a12,b12;a21,b21,a22,b22;a31,b31,a32,b32;a41,b41,a42,b42];(2)Levy 曲线程序levy.mfunction levy(n)% levy(16),n为levy曲线迭代次数%x1,y1,x2,y2为初始线段两端点坐标,nn为迭代次数n=16;x1=0;y1=0;x2=1;y2=0;%第i-1次迭代时由各条线段产生的新两条线段的三端点横、纵坐标存储在数组X、Y中[X,Y]=levy1(x1,y1,x2,y2);for i=1:nfor j=1:length(X)/3w=levy2(X(1+3*(j-1):3*j),Y(1+3*(j-1):3*j));[XX(3*2*(j-1)+1:3*2*(j-1)+3),YY(3*2*(j-1)+1:3*2*(j-1)+3)]=levy1(w(1,1),w(1,2) ,w(1,3),w(1,4));[XX(3*2*(j-1)+3+1:3*2*(j-1)+3+3),YY(3*2*(j-1)+3+1:3*2*(j-1)+3+3)]=levy1(w (2,1),w(2,2),w(2,3),w(2,4));endX=XX;Y=YY;endplot(X,Y)hold onaxis equal%由以(x1,y1),(x2,y2)为端点的线段生成新的中间点坐标并把(x1,y1),(x2,y2)连同新点横、纵坐%标依次分别存储在数组X,Y中function [X,Y]=levy1(x1,y1,x2,y2)x3=1/2*(x1+x2+y1-y2);y3=1/2*(-x1+x2+y1+y2);X=[x1,x3,x2];Y=[y1,y3,y2];%把由函数levy1生成的三点横、纵坐标X,Y顺次划分为两组,分别对应两条折线段中每条线%段两端点的坐标,并依次分别存储在2*4阶矩阵w中,w中第i(i=1,2)行数字代表第i条线段%两端点的坐标function w=levy2(X,Y)a11=X(1);b11=Y(1);a12=X(2);b12=Y(2);a21=X(2);b21=Y(2);a22=X(3);b22=Y(3);w=[a11,b11,a12,b12;a21,b21,a22,b22];(3)分形树程序tree.hfunction tree(n,a,b)% tree(8,pi/8,pi/8),n为分形树迭代次数%a,b为分枝与竖直方向夹角%x1,y1,x2,y2为初始线段两端点坐标,nn为迭代次数n=8;a=pi/8;b=pi/8;x1=0;y1=0;x2=0;y2=1;plot([x1,x2],[y1,y2])hold on[X,Y]=tree1(x1,y1,x2,y2,a,b);hold onW=tree2(X,Y);w1=W(:,1:4);w2=W(:,5:8);% w为2^k*4维矩阵,存储第k次迭代产生的分枝两端点的坐标,% w的第i(i=1,2,…,2^k)行数字对应第i个分枝两端点的坐标w=[w1;w2];for k=1:nfor i=1:2^k[X,Y]=tree1(w(i,1),w(i,2),w(i,3),w(i,4),a,b);W(i,:)=tree2(X,Y);endw1=W(:,1:4);w2=W(:,5:8);w=[w1;w2];end%由每个分枝两端点坐标(x1,y1),(x2,y2)产生两新点的坐标(x3,y3),(x4,y4),画两分枝图形,并把%(x2,y2)连同新点横、纵坐标分别存储在数组X,Y中function [X,Y]=tree1(x1,y1,x2,y2,a,b)L=sqrt((x2-x1)^2+(y2-y1)^2);if (x2-x1)==0a=pi/2;else if (x2-x1)<0a=pi+atan((y2-y1)/(x2-x1));elsea=atan((y2-y1)/(x2-x1));endendx3=x2+L*2/3*cos(a+b);y3=y2+L*2/3*sin(a+b);x4=x2+L*2/3*cos(a-b);y4=y2+L*2/3*sin(a-b);a=[x3,x2,x4];b=[y3,y2,y4];plot(a,b)axis equalhold onX=[x2,x3,x4];Y=[y2,y3,y4];%把由函数tree1生成的X,Y顺次划分为两组,分别对应两分枝两个端点的坐标,并存储在一维%数组w中function w=tree2(X,Y)a1=X(1);b1=Y(1);a2=X(2);b2=Y(2);a3=X(1);b3=Y(1);a4=X(3);b4=Y(3);w=[a1,b1,a2,b2,a3,b3,a4,b4];(4)IFS算法画Sierpinski三角形程序sierpinski_ifs.h function sierpinski_ifs(n,w1,w2,w3)%sierpinski_ifs(10000,1/3,1/3,1/3)%w1,w2,w3出现频率n=10000;w1=1/3;w2=1/3;w3=1/3;M1=[0.5 0 0 0 0.5 0];M2=[0.5 0 0.5 0 0.5 0];M3=[0.5 0 0.25 0 0.5 0.5];x=0;y=0;% r为[0,1]区间内产生的n维随机数组r=rand(1,n);B=zeros(2,n);k=1;% 当0<r(i)<1/3时,进行M1对应的压缩映射;% 当1/3=<r(i)<2/3时,进行M2对应的压缩映射;% 当2/3=<r(i)<1时,进行M3对应的压缩映射;for i=1:nif r(i)<w1a=M1(1);b=M1(2);e=M1(3);c=M1(4);d=M1(5);f=M1(6);else if r(i)<w1+w2a=M2(1);b=M2(2);e=M2(3);c=M2(4);d=M2(5);f=M2(6);else if r(i)<w1+w2+w3a=M3(1);b=M3(2);e=M3(3);c=M3(4);d=M3(5);f=M3(6);endendendx=a*x+b*y+e;y=c*x+d*y+f;B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)(5)IFS算法画Julia集程序julia_ifs.h function julia_ifs(n,cx,cy)% julia_ifs(100000,-0.77,0.08)% f(z)=z^2+c,cx=real(c);cy=image(c);n=10000;cx=-0.77;cy=0.08;% z^2+c=z0,x=real(z0);y=image(z0);x=1;y=1;B=zeros(2,n);k=1;% A为产生的服从标准正态分布的n维随机数组A=randn(1,n);for i=1:nwx=x-cx;wy=y-cy;if wx>0alpha=atan(wy/wx);endif wx<0alpha=pi+atan(wy/wx);endif wx==0alpha=pi/2;endalpha=alpha/2;r=sqrt(wx^2+wy^2);if A(i)<0r=-sqrt(r);elser=sqrt(r);endx=r*cos(alpha);y=r*sin(alpha);B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)(6) 逃逸时间算法画Sierpinski垫片程序sierpinski.h function sierpinski(a,b,c,d,n,m,r)%sierpinski(0,0,1,1,12,200,200)%(a,b),(c,d)收敛区域左上角和右下角坐标,m为分辨率% n为逃逸时间,需要反复试探,r逃逸半径a=0;b=0;c=1;d=1;n=12;m=200;r=200;B=zeros(2,m*m);w=1;for i=1:mx0=a+(c-a)*(i-1)/m;for j=1:my0=b+(d-b)*(j-1)/m;x=x0;y=y0;for k=1:nif y>0.5x=2*x;y=2*y-1;else if x>=0.5x=2*x-1;y=2*y;elsex=2*x;y=2*y;endif x^2+y^2>rbreak;endendif k==nB(1,w)=i;B(2,w)=j;w=w+1;endendendplot(B(1,:),B(2,:),'.','markersize',0.1)(7) 元胞自动机算法画Sierpinski三角形程序一维元胞自动机sierpinski_ca1.hfunction sierpinski_ca1(m,n)%sierpinski_ca1(1000,3000)m=1000;n=3000;x=1;y=1;t=1;w=zeros(2,m*n);s=zeros(m,n);s(1,fix(n/3))=1;for i=1:m-1for j=2:n-1if (s(i,j-1)==1&s(i,j)==0&s(i,j+1)==0)|(s(i,j-1)==0&s(i,j)==0&s(i,j+1)==1)s(i+1,j)=1;w(1,t)=x+3+3*j;w(2,t)=y+5*i;t=t+1;endendendplot(w(1,:),w(2,:),'.','markersize',1)² 二维元胞自动机sierpinski_ca2.h function sierpinski_ca2(m,n)%sierpinski_ca2(400,400)m=400;n=400;t=1;w=zeros(2,m*n);s=zeros(m,n);s(m/2,n/2)=1;for i=[m/2:-1:2,m/2:m-1]for j=[n/2:-1:2,n/2:n-1]ifmod(s(i-1,j-1)+s(i,j-1)+s(i+1,j-1)+s(i-1,j)+s(i+1,j)+s(i-1,j+1)+s(i,j+1)+s(i+1,j+1),2)== 1s(i,j)=1;w(1,t)=i;w(2,t)=j;t=t+1;endendendplot(w(1,:),w(2,:),'.','markersize',0.1)(8) IFS算法画Helix曲线程序helix_ifs.hfunction helix_ifs(n,w1,w2,w3)%helix_ifs(20000,0.9,0.05,0.05)%w1,w2,w3为出现频率n=20000;w1=0.9;w2=0.05;w3=0.05;M1=[0.787879 -0.424242 1.758647 0.242424 0.859848 1.408065]; M2=[-0.121212 0.257576 -6.721654 0.05303 0.05303 1.377236]; M3=[0.181818 -0.136364 6.086107 0.090909 0.181818 1.568035]; x=0;y=0;% r为[0,1]区间内产生的n维随机数组r=rand(1,n);B=zeros(2,n);k=1;% 当0<r(i)<1/3时,进行M1对应的压缩映射;% 当1/3=<r(i)<2/3时,进行M2对应的压缩映射;% 当2/3=<r(i)<1时,进行M3对应的压缩映射;for i=1:nif r(i)<w1a=M1(1);b=M1(2);e=M1(3);c=M1(4);d=M1(5);f=M1(6);else if r(i)<w1+w2a=M2(1);b=M2(2);e=M2(3);c=M2(4);d=M2(5);f=M2(6);else if r(i)<w1+w2+w3a=M3(1);b=M3(2);e=M3(3);c=M3(4);d=M3(5);f=M3(6);endendendx=a*x+b*y+e;y=c*x+d*y+f;B(1,k)=x;B(2,k)=y;k=k+1;endplot(B(1,:),B(2,:),'.','markersize',0.1)/link?url=CEfKyhT7lmb10gOVen5eSHpjztx2JuN1vJf02qoyK9oXrqfTYE TbwxhPSE7QdgQrzqObbSGfbQixLyP3U09MokUvaST2CcsGP4uFqYi6YF_小宇宙被誉为大自然的几何学的分形(Fractal)理论,是现代数学的一个新分支,但其本质却是一种新的世界观和方法论。