如何编程分形?

我没有编程分形的经验。 当然,我见过着名的曼德尔布罗图像等等。

你能给我提供简单的分形algorithm吗?

编程语言并不重要,但我最熟悉的是actionscript,C#,Java。

我知道,如果我谷歌分形,我得到了很多(复杂)的信息,但我想先从一个简单的algorithm,并与它玩。

对于改进基本algorithm的build议也是受欢迎的,比如如何使它们在那些可爱的颜色等等。

对Mandelbrot进行编程非常简单。
我的quick-n-dirty代码在下面(不保证是没有错误的,但是是一个好的轮廓)。

以下是纲要:Mandelbrot集合位于复杂网格中,完全位于半径为2的圆内。

所以,开始扫描矩形区域的每一个点。 每个点代表一个复数(x + yi)。 迭代复数:

[new value] = [old-value]^2 + [original-value] ,同时跟踪两件事情:

1.)迭代次数

2.)[新值]与原点的距离。

如果达到最大迭代次数,就完成了。 如果距离原点的距离大于2,则表示完成。

完成后,根据已完成的迭代次数对原始像素着色。 然后移动到下一个像素。

  public void MBrot() { float epsilon = 0.0001; // The step size across the X and Y axis float x; float y; int maxIterations = 10; // increasing this will give you a more detailed fractal int maxColors = 256; // Change as appropriate for your display. Complex Z; Complex C; int iterations; for(x=-2; x<=2; x+= epsilon) { for(y=-2; y<=2; y+= epsilon) { iterations = 0; C = new Complex(x, y); Z = new Complex(0,0); while(Complex.Abs(Z) < 2 && iterations < maxIterations) { Z = Z*Z + C; iterations++; } Screen.Plot(x,y, maxColors % iterations); // depending on the number of iterations, color a pixel. } } } 

遗漏的一些细节是:

1.)准确了解复数的正方形以及如何计算。

2.)找出如何将(-2,2)矩形区域转换为屏幕坐标。

你确实应该从Mandelbrot集合开始,理解它到底是什么。

背后的想法是相对简单的。 你从一个复杂variables的函数开始

f(z)= z ^ 2 + C

其中z是复variables ,C是复常数 。 现在你从z = 0开始迭代它,也就是计算z1 = f(0),z2 = f(z1),z3 = f(z2)等等。 Mandelbrot集合(维基百科页面图中的黑色集合)是序列z1,z2,z3,…所包含的那些常数C的集合,也就是说,它不会无穷大。

在实践中,绘制Mandelbrot集应该:

  • 在复平面中select一个矩形(比如,从点-2-2i到点2 + 2i)。
  • 用合适的矩形网格点(例如400×400点)覆盖矩形,将其映射到显示器上的像素。
  • 对于每个点/像素,设C为该点,计算对应的迭代序列z1,z2,z3,…的20项,并检查它是否“趋于无穷”。 在实践中,您可以在迭代时检查20个项中的一个的绝对值是否大于2(如果其中一个项有效,则后续项保证是无界的)。 如果有一些z_k,序列“无限”。 否则,你可以认为它是有界的。
  • 如果对应于特定点C的序列是有界的,则在图片上绘制相应的像素为黑色(因为它属于Mandelbrot集合)。 否则,用另一种颜色绘制。 如果你想获得乐趣并制作出漂亮的情节,请根据abs(第20期)的大小绘制不同的颜色。

关于分形的惊人事实是我们如何从简单而明显无害的需求中获得极其复杂的集合(特别是Mandelbrot集合的边界 )。

请享用!

如果复杂的数字让你头痛,那么可以使用L系统来制定广泛的分形。 这需要几个层进行交互,但每个层都有自己的权利。

首先你需要一只乌龟。 前进,后退,左,右,笔,笔下。 即使没有L系统驱动,也可以使用乌龟几何graphics制作很多有趣的graphics。 search“LOGOgraphics”或“乌龟graphics”。 一个完整的LOGO系统实际上是一个Lisp编程环境,它使用了一个不完整的剑桥波兰语法。 但是,你不必走近那么远就可以用乌龟的概念获得一些漂亮的照片。

那么你需要一个层来执行一个L系统。 L系统与Post-system和Semi-Thue系统有关 ,像virii一样跨越图灵完备性的边界。 这个概念是string重写 。 它可以被实现为一个macros扩展或一个具有额外控制的程序集来限制recursion。 如果使用macros扩展(如下面的例子),你仍然需要一个程序集来映射符号到turtle命令和一个过程来遍历string或数组来运行编码的turtle程序。 对于有界recursion过程集( 例如 ),您可以将乌龟命令embedded到过程中,并将recursion级别检查添加到每个过程,或者将其分解为一个处理函数。

下面是使用macros扩展和一个非常简化的乌龟命令集的PostScript中的毕达哥拉斯树的例子。 有关python和mathematica的一些示例,请参阅我的代码高尔夫挑战 。

ps l-system pythagoras tree luser-droog

有一本叫“ Chaos and Fractals”的书,在每章末尾都有简单的示例代码,它们实现了一些分形或其他的例子。 很久以前,当我读这本书的时候,我把每个示例程序(用一些基本方言)转换成一个运行在网页上的Java小程序。 小程序在这里: http : //hewgill.com/chaos-and-fractals/

其中一个例子是一个简单的Mandelbrot实现。

另一个很好的分形是Sierpinski三angular形分形。

基本上,绘制三angular形的三angular(等边是首选,但任何三angular将起作用),然后在其中一个angular落开始一个点P. 将P中途任意移动到任意一个angular落,并在那里画一个点。 再次将P移动到任意一个angular落,画出并重复。

你会认为随机运动会产生一个随机的结果,但实际上并没有。

参考: http : //en.wikipedia.org/wiki/Sierpinski_triangle

谢尔宾斯基三angular形和科赫曲线是特殊types的火焰分形。 火焰分形是一种非常普遍的迭代函数系统,因为它使用非线性函数。

IFS的algorithm如下:

Start with a random point.

重复以下次数(至less一百万次,取决于最终的图像大小):

Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.

如果该点位于屏幕之外,则在屏幕内随机select一个新点。

如果你想要漂亮的颜色,让颜色取决于上次使用的转换。

我会从简单的事情开始,比如科赫雪花 。 这是一个简单的过程,把一条线和变换,然后recursion地重复这个过程,直到它看起来整齐。

一些超级简单的东西,比如拿2分(一条线),加一个第三点(做一个angular),然后重复创build的每一个新的部分。

 fractal(p0, p1){ Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1; fractal(p0,Pmid); fractal(Pmid, p1); } 

我在博客上有一系列用C#编写的教程和代码,以生成不less分形,包括Mandelbrot,Julia,Sierpinski,Plasma,Fern和Newton-Rhapson分形。 我也有从教程中提到的所有分形可以从同一位置下载的完整源代码。

我想你可能不会看到分形作为一种algorithm或编程的东西。 分形是一个概念! 这是一个详细的模式重复自己的math概念。

因此,您可以使用不同的方法以多种方式创build分形,如下图所示。

在这里输入图像说明

select一种方法,然后研究如何实施它。 这四个例子是使用Marvin框架实现的。 源代码在这里可用

mandelbrot集是通过反复评估一个函数直到它溢出(某些定义的限制),然后检查需要多长时间才能溢出而生成的。

伪代码:

 MAX_COUNT = 64 // if we haven't escaped to infinity after 64 iterations, // then we're inside the mandelbrot set!!! foreach (x-pixel) foreach (y-pixel) calculate x,y as mathematical coordinates from your pixel coordinates value = (x, y) count = 0 while value.absolutevalue < 1 billion and count < MAX_COUNT value = value * value + (x, y) count = count + 1 // the following should really be one statement, but I split it for clarity if count == MAX_COUNT pixel_at (x-pixel, y-pixel) = BLACK else pixel_at (x-pixel, y-pixel) = colors[count] // some color map. 

笔记:

值是一个复数。 复数(a + b i)被平方给出( a-b * b + 2 * a b i)。 您将不得不使用复杂types,或者在循环中包含该计算。

这里是一个简单和容易理解的mandelbrot和其他分形例子Java代码

http://code.google.com/p/gaima/wiki/VLFImages

只需下载BuildFractal.jar以在Java中testing它并使用命令运行即可:

java -Xmx1500M -jar BuildFractal.jar 1000 1000默认MANDELBROT

源代码也可以免费下载/浏览/编辑/展开。

那么,简单而具有吸引力的graphics并不是真正的齐头并进。 如果你对编程分形非常认真,我build议读一下迭代函数系统和渲染它们所取得的进展。

flame_draves.pdf

上面的人正在使用findsierpinski和Koch的中点,我更推荐复制形状,缩放它们,然后翻译它们以实现“分形”效果。 Java的sierpinski伪代码看起来像这样:

 public ShapeObject transform(ShapeObject originalCurve) { Make a copy of the original curve Scale x and y to half of the original make a copy of the copied shape, and translate it to the right so it touches the first copied shape make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up Group the 3 new shapes into one return the new shape } 

有时我会把分形编程为乐趣和挑战。 你可以在这里find它们。 代码使用P5.js库以Javascript编写,可直接从HTML源代码读取。

对于那些我见过的algorithm非常简单,只需find核心元素,然后重复一遍又一遍。 我用recursion函数来做,但可以做不同的事情。