由特定函数定义的 Mandelbrot 集
Mandelbrot set defined by a specific function
我正在试验 canvas 并试图修改 this piece of code,但不幸的是我不理解其中的某些部分。
我的问题是 - 如何自定义上面的代码,例如
f(z) = c^e(-z)
(公式取自有分形例子的书)?
我知道我需要更改这部分代码:
function computeRow(task) {
var iter = 0;
var c_i = task.i;
var max_iter = task.max_iter;
var escape = task.escape * task.escape;
task.values = [];
for (var i = 0; i < task.width; i++) {
var c_r = task.r_min + (task.r_max - task.r_min) * i / task.width;
var z_r = 0, z_i = 0;
for (iter = 0; z_r*z_r + z_i*z_i < escape && iter < max_iter; iter++) {
// z -> z^2 + c
var tmp = z_r*z_r - z_i*z_i + c_r;
z_i = 2 * z_r * z_i + c_i;
z_r = tmp;
}
if (iter == max_iter) {
iter = -1;
}
task.values.push(iter);
}
return task;
}
但是 z_i、z_r、c_i、c_r 的真正含义以及我如何将它们绑定到上述公式。
如有任何帮助,我们将不胜感激。
复数有两部分:实数、虚数。
所以z = a + b*i
,其中a
是实部,b*i
是虚部。
在为 z=z^2+c
提供的示例中,其中 z=z_r+z_i*i
注意: i*i = -1
所以z^2 = (z_r+z_i*i)*(z_r+z_i*i) = z_r*z_r+2*z_r*z_i*i + z_i*i*z_i*i = z_r*z_r+2*z_r*z_i*i - z_i*z_i
现在添加 c
:z_r*z_r+2*z_r*z_i*i - z_i*z_i + c_r + c_i*i
将其分组
z_r*z_r+2*z_r*z_i*i - z_i*z_i + c_r + c_i*i = (z_r*z_r - z_i*z_i + c_r) + (2*z_r*z_i + c_i)*i
所以我们从代码中得到 tmp
var - 是新 z
的真实部分
tmp = z_r*z_r - z_i*z_i + c_r
和虚部
2*z_r*z_i + c_i
由于z = z_r + z_i * i
,我们需要赋值
z_r = z_r*z_r - z_i*z_i + c_r
z_i = 2*z_r*z_i + c_i
更新: f(z) = e^z - c
首先,几个复杂的形式:x = a+b*i = |x|(cos(p)+i*sin(p)) = |x|*e^(i*p)
其中 |x| = sqrt(a*a + b*b)
和 p = b/a
在我们的案例中:p=z_i/z_r
、|z| = sqrt(z_r*z_r+z_i*z_i)
e^z = e^(z_r+z_i*i) = e^z_r * (e^z_i*i) = e^z_r * (cos(p)+i*sin(p)) = (e^z_r * cos(p)) + i * (e^z_r * sin(p))
减去c
:
(e^z_r * cos(p)) + i * (e^z_r * sin(p)) - c_r - c_i*i = (e^z_r * cos(p) - c_r) + i * (e^z_r * sin(p) - c_i)
所以新z
z_r = (e^z_r * cos(p) - c_r) = (e^z_r * cos(z_i/z_r) - c_r)
z_i = (e^z_r * sin(p) - c_i) = (e^z_r * sin(z_i/z_r) - c_i)
我正在试验 canvas 并试图修改 this piece of code,但不幸的是我不理解其中的某些部分。
我的问题是 - 如何自定义上面的代码,例如
f(z) = c^e(-z)
(公式取自有分形例子的书)?
我知道我需要更改这部分代码:
function computeRow(task) {
var iter = 0;
var c_i = task.i;
var max_iter = task.max_iter;
var escape = task.escape * task.escape;
task.values = [];
for (var i = 0; i < task.width; i++) {
var c_r = task.r_min + (task.r_max - task.r_min) * i / task.width;
var z_r = 0, z_i = 0;
for (iter = 0; z_r*z_r + z_i*z_i < escape && iter < max_iter; iter++) {
// z -> z^2 + c
var tmp = z_r*z_r - z_i*z_i + c_r;
z_i = 2 * z_r * z_i + c_i;
z_r = tmp;
}
if (iter == max_iter) {
iter = -1;
}
task.values.push(iter);
}
return task;
}
但是 z_i、z_r、c_i、c_r 的真正含义以及我如何将它们绑定到上述公式。
如有任何帮助,我们将不胜感激。
复数有两部分:实数、虚数。
所以z = a + b*i
,其中a
是实部,b*i
是虚部。
在为 z=z^2+c
提供的示例中,其中 z=z_r+z_i*i
注意: i*i = -1
所以z^2 = (z_r+z_i*i)*(z_r+z_i*i) = z_r*z_r+2*z_r*z_i*i + z_i*i*z_i*i = z_r*z_r+2*z_r*z_i*i - z_i*z_i
现在添加 c
:z_r*z_r+2*z_r*z_i*i - z_i*z_i + c_r + c_i*i
将其分组
z_r*z_r+2*z_r*z_i*i - z_i*z_i + c_r + c_i*i = (z_r*z_r - z_i*z_i + c_r) + (2*z_r*z_i + c_i)*i
所以我们从代码中得到 tmp
var - 是新 z
tmp = z_r*z_r - z_i*z_i + c_r
和虚部
2*z_r*z_i + c_i
由于z = z_r + z_i * i
,我们需要赋值
z_r = z_r*z_r - z_i*z_i + c_r
z_i = 2*z_r*z_i + c_i
更新: f(z) = e^z - c
首先,几个复杂的形式:x = a+b*i = |x|(cos(p)+i*sin(p)) = |x|*e^(i*p)
其中 |x| = sqrt(a*a + b*b)
和 p = b/a
在我们的案例中:p=z_i/z_r
、|z| = sqrt(z_r*z_r+z_i*z_i)
e^z = e^(z_r+z_i*i) = e^z_r * (e^z_i*i) = e^z_r * (cos(p)+i*sin(p)) = (e^z_r * cos(p)) + i * (e^z_r * sin(p))
减去c
:
(e^z_r * cos(p)) + i * (e^z_r * sin(p)) - c_r - c_i*i = (e^z_r * cos(p) - c_r) + i * (e^z_r * sin(p) - c_i)
所以新z
z_r = (e^z_r * cos(p) - c_r) = (e^z_r * cos(z_i/z_r) - c_r)
z_i = (e^z_r * sin(p) - c_i) = (e^z_r * sin(z_i/z_r) - c_i)