当我制作普通的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));
但是,尽管它看起来确实是倒过来的,但仍然失真,看起来不像泪珠。这是一张照片:
。
实施代码时我做错了什么吗?
答案 0 :(得分:3)
我们需要将c
视为一个复数,因此在正常的曼德布罗特情况下,我们有:
zy = 2*zx * zy + cy;
zx = zx2 - zy2 + cx;
但是要获得c
的倒数,我们必须做一个 complex 倒数:
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
倒Mandelbrot:
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