当试图创建一个倒置的 Mandelbrot 集时,它被扭曲了

When trying to create an inverted Mandelbrot-set it's distorted

当我制作普通的 Mandelbrot 集时,它工作正常。但是当我尝试将它转换成类似泪珠的东西时(更多上下文请参见此处:https://www.youtube.com/watch?v=mLJJUElQMRY)它完全变形并且看起来一点也不像泪珠。

我已经尝试调查它,但似乎我做的一切都是正确的。我通过将 1 除以 'c' 变量来反转它。

这是我的代码的一部分,它是实际的公式,这是在处理中编写的,只是 Java 添加了可视化库:

zx2=zx*zx;
zy2=zy*zy;
zy = 2*zx*zy + 1.0/(y); //the "1.0/" is what makes it inverted, a normal Mandelbrot set is just y and x on its own.
zx = zx2-zy2 + 1.0/(x);

当我 运行 代码时,它非常变形,甚至看起来不像泪珠!这是它的样子:

然后我尝试通过实现答案的代码来修复它,这是代码:

zx2=zx*zx;
zy2=zy*zy;
zy = 2*zx*zy + (y/(x*x+y*y));
zx = zx2-zy2 + (x/(x*s+y*y));       

不过虽然看起来是倒过来的,但还是变形了,不像是泪珠。这是一张照片:

.

我在实现代码时是否做错了什么?

我们需要将 c 视为复数,因此在正常的 Mandelbrot 情况下,我们有:

zy = 2*zx * zy + cy;
zx = zx2 - zy2 + cx;

但是要得到 c 的倒数,我们必须做一个 复数 倒数:

zy = 2*zx * zy + (cy / (cx**2 + cy**2));
zx = zx2 - zy2 + (cx / (cx**2 + cy**2));

当然,由于c从循环的角度来看是常数,我们可以在循环前计算倒数。在像 Python 这样具有复数的语言中,这是对普通 Mandelbrot 的简单更改:

c = complex(real, imaginary)

z = 0j

for i in range(iterations):
    if abs(z) >= 4.0:
        break

    z = z * z + c

到倒曼德尔布罗:

c = 1 / complex(real, imaginary)

z = 0j

for i in range(iterations):
    # ...

但是如果我们自己实现复数,那么对于普通的 Mandelbrot,我们会这样做:

x = real
y = imaginary

zx = 0
zy = 0

for i in range(iterations):
    zx2 = zx * zx
    zy2 = zy * zy

    if ((zx2 + zy2) ** 0.5) >= 4.0:
        break

    zy = 2*zx * zy + y
    zx = zx2 - zy2 + x

对于倒置的 Mandelbrot,我们这样做:

denominator = real**2 + imaginary**2

x = real / denominator
y = imaginary / denominator

zx = 0
zy = 0

for i in range(iterations):
    # ...

最重要的是,两者之间的区别是:

1 / complex(real, imaginary)  # correct

和:

complex(1 / real, 1 / imaginary)  # incorrect