我没有编写分形程序的经验。当然,我看过著名的Mandelbrot图像等。
你能提供一些简单的分形算法吗?
编程语言并不重要,但我最熟悉的是ActionScript、C#和Java。
我知道如果我在谷歌上搜索分形,会得到很多(复杂)信息,但我想从一个简单的算法开始,并进行尝试。
欢迎提出改进基本算法的建议,例如如何制作那些可爱的颜色等。
我没有编写分形程序的经验。当然,我看过著名的Mandelbrot图像等。
你能提供一些简单的分形算法吗?
编程语言并不重要,但我最熟悉的是ActionScript、C#和Java。
我知道如果我在谷歌上搜索分形,会得到很多(复杂)信息,但我想从一个简单的算法开始,并进行尝试。
欢迎提出改进基本算法的建议,例如如何制作那些可爱的颜色等。
编写曼德博集合程序很容易。
以下是我的快速代码(不能保证无错误,但是是一个好的概述)。
这是概述: 曼德博集合完全位于半径为2的圆内的复数格中。
因此,从扫描该矩形区域中的每个点开始。 每个点代表一个复数(x + yi)。 迭代该复数:
[新值] = [旧值]² + [原始值]
同时跟踪两件事:
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, iterations % maxColors); //depending on the number of iterations, color a pixel.
}
}
}
有一些细节没有提到:
1.) 学习复数的平方是什么以及如何计算。
2.) 找出如何将矩形区域 (-2,2) 转换为屏幕坐标。
你确实应该从曼德博集合开始,并理解它是什么。
它背后的思想相对简单。你从一个关于复变量的函数开始:
f(z) = z2 + C
其中 z 是一个复数 变量,C 是一个复数 常数。现在你从 z=0 开始迭代计算,也就是计算 z1 = f(0), z2 = f(z1), z3 = f(z2) 等等。对于那些序列 z1, z2, z3, ... 是 有界的,也就是不会无限增长的常数 C 组成的集合,称为曼德博集合(即维基百科页面上黑色的集合)。
在实践中,要画出曼德博集合,你需要:
分形的惊人之处在于我们如何从简单而表面无害的要求中获得一个极其复杂的集合(特别是曼德博集合的“边缘”)。
享受吧!
首先,你需要一只海龟。前进、后退、左转、右转、笔起、笔落。即使没有L系统的驱动,使用海龟图形和海龟几何学也可以制作出许多有趣的形状。搜索“LOGO图形”或“海龟图形”。完整的LOGO系统实际上是一个使用未括号化的Cambridge Polish语法的Lisp编程环境。但你不必走得那么远,就可以使用海龟概念获得一些漂亮的图片。
有一本名为《混沌与分形》的好书,每章末尾都有简单的示例代码,实现了某些分形或其他示例。很久以前我读这本书时,将每个示例程序(用某种Basic方言编写)转换成了在网页上运行的Java小程序。这些小程序在此处:http://hewgill.com/chaos-and-fractals/
其中一个示例是一个简单的Mandelbrot实现。
fractal(p0, p1){
Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
fractal(p0,Pmid);
fractal(Pmid, p1);
}
function mandel(x,y) {
var a=0; var b=0;
for (i = 0; i<250; ++i) {
// Complex z = z^2 + c
var t = a*a - b*b;
b = 2*a*b;
a = t;
a = a + x;
b = b + y;
var m = a*a + b*b;
if (m > 10) return i;
}
return 250;
}
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.
注意:
value是一个复数。复数(a+bi)的平方是(aa-b*b+2*abi)。你需要使用复数类型,或者在循环中包含该计算。