Mor*_*S42 2 java processing fractals mandelbrot complex-numbers
当我制作一个普通的曼德尔布罗集时,它工作得很好。但是,当我尝试将其反转为类似泪滴的东西时(请参阅此处了解更多背景信息: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);
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它非常扭曲,甚至看起来都不像泪滴!它看起来是这样的:

然后我尝试通过实现答案的代码来修复它,代码如下:
zx2=zx*zx;
zy2=zy*zy;
zy = 2*zx*zy + (y/(x*x+y*y));
zx = zx2-zy2 + (x/(x*s+y*y));
Run Code Online (Sandbox Code Playgroud)
但虽然它看起来确实是倒置的,但它仍然是扭曲的,看起来不像泪滴。这是一张照片:
。
我在实现代码时做错了什么吗?
我们需要将其视为c一个复数,因此在正常的 Mandelbrot 情况下,我们有:
zy = 2*zx * zy + cy;
zx = zx2 - zy2 + cx;
Run Code Online (Sandbox Code Playgroud)
但为了得到 的倒数c,我们必须做一个复杂的倒数:
zy = 2*zx * zy + (cy / (cx**2 + cy**2));
zx = zx2 - zy2 + (cx / (cx**2 + cy**2));
Run Code Online (Sandbox Code Playgroud)
当然,由于c从循环的角度来看 是常数,因此我们可以在循环之前计算倒数。在像 Python 这样的复数语言中,这是对普通 Mandelbrot 的简单更改:
c = complex(real, imaginary)
z = 0j
for i in range(iterations):
if abs(z) >= 4.0:
break
z = z * z + c
Run Code Online (Sandbox Code Playgroud)
到倒曼德尔布罗特:
c = 1 / complex(real, imaginary)
z = 0j
for i in range(iterations):
# ...
Run Code Online (Sandbox Code Playgroud)
但如果我们自己实现复数,那么对于正常的曼德尔布罗特我们会这样做:
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
Run Code Online (Sandbox Code Playgroud)
对于倒曼德尔布罗特,我们做:
denominator = real**2 + imaginary**2
x = real / denominator
y = imaginary / denominator
zx = 0
zy = 0
for i in range(iterations):
# ...
Run Code Online (Sandbox Code Playgroud)
归根结底,这是以下之间的区别:
1 / complex(real, imaginary) # correct
Run Code Online (Sandbox Code Playgroud)
和:
complex(1 / real, 1 / imaginary) # incorrect
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |