所以我读了这篇文章:http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand 但我卡在了第 7 步。我正在 javascript canvas 中绘制集合。
我所需要的基本上就是我猜测的C值。
for (var y = 0; y < ImageHeight; y++) {
for (var x = 0; x < ImageWidth; x++) {
// Pixel-Position for ImageObject
var xy = (x + y * image.width) * 4;
// Convert Image-Dimension to a radius of 2
var xi = ((x / ImageWidth) * 4) - 2;
var yi = ((y / ImageHeight) * 4) - 2;
for (var n = 0; n < MaxIterations; n++) {
// Complex number stuff..?
z = (xi*xi) + (yi*yi) + c;
c = 0; // Somethig with z ..?
if (z < 4) {
image.data[xy] = inner_color[0];
image.data[xy+1] = inner_color[1];
image.data[xy+2] = inner_color[2];
image.data[xy+3] = Math.round(n * cdiff);
} else {
image.data[xy] = outer_color[0];
image.data[xy+1] = outer_color[1];
image.data[xy+2] = outer_color[2];
image.data[xy+3] = Math.round(n * cdiff);
break;
}
}
}
}
我还读了很多关于虚数之类的东西,但我不太明白如何用它们进行计算。它们对我来说似乎毫无用处,因为无论如何你都必须将它们转换回实数才能在 javascript 中进行逻辑运算。
它看起来像这样:[已删除]
如果删除 url 末尾的 2,您会看到另一个版本,我刚刚重写了一些 c++ 代码片段。
但缩放有点奇怪,这就是为什么我想自己写这一切..
我理解曼德尔布罗特集创建的基本概念,但正如我所说,复杂的部分让我感到困扰。有没有更简单的解释?
你必须先了解这一点:
z = z^2 + c
让我们分解一下。
z
和c
都是复数(最近的一个问题教会我强调这一点,它们有小数位,并且可以看起来像这样:c=-0.70176-0.3842i
)。复数可以有一个“非实数”部分,正确的术语是“虚数”部分,你可以用以下形式写出一个“单个”复数:
(a + bi)
等同于:(a + b*i)
如果 b 是 0,那么你就有一个 a + 0i
,它只是 a
,所以没有
虚数部分,你就有一个实数。您的链接没有提到复数最重要的属性,尤其是其虚数部分的属性
i == sqrt(-1)
。在实数领域,不存在负数的平方根,这就是复数的用武之地,它可以让你得到 -1 的平方根。让我们将 i
提高到 2 次方:
i^2 == -1
,神奇!虚部 (i
) 必须由您处理(特殊的平方),或者您使用的编程语言将提供一个 Complex 类型来为您处理它。
现在回到扩展
z^2
:
z == (a+bi)
,因此z^2 == (a+bi)^2
,所以
z^2 == (a^2 + bi^2 + 2*a*bi)
。我们也来分解一下:
a^2
bi^2
=> 棘手的部分。这真的是b^2*i^2
i^2
,即-1
,这使得它成为b^2*-1
或:-b^2
。所以这也是一个实数。
2*a*b*i
=> 这将是z^2 = (a^2-b^2+2*a*bi)
示例(有点过于详细。您可以将其视为循环中的第一次迭代):
z = (5 + 3i)
z^2 = (5 + 3i)^2
= (5^2 + 3^2*i^2 + 2*5*3i)
= (25 + 9i^2 + 30i)
= (25 + 9*-1 + 30i)
= (25 - 9 + 30i)
= (16 + 30i)
现在,如果您了解复数的迭代和乘法,请了解一些关于 Mandelbrot 的内容(以及关于
c
值):当您想要创建 Mandelbrot 集时,您实际上是在复杂平面上寻找点,如果使用上面讨论的迭代进行迭代(例如 50 次),则该点永远不会达到无穷大。 Mandelbrot 集是通常看到的“Mandelbrot”图片中的
黑色部分,而不是闪亮的彩色部分。
通常的工作流程是这样的:
在复平面上选择一个点,例如 (1.01312 + 0.8324i) => 这将是
c
z = z^2 + c
。对于初学者来说,这样做 50 次。这将为您提供一个复数结果。不属于曼德尔布罗特集的一部分*。当您需要为点着色时就会出现这种情况(这是曼德尔布罗集的彩色部分)。如果复数的两个部分都小于 2,我们假设该点永远不会达到无穷大(即使迭代无数次),并将该点视为 Mandelbrot 集的一部分,并且其颜色将为黑色。
c
,将零放入z
*实际上,验证一个点是否是集合的一部分有点复杂,但这对于原型来说效果很好