При попытке создать перевернутый набор Мандельброта он искажается - PullRequest
3 голосов
/ 18 мая 2019

Когда я делаю нормальный набор Мандельброта, он работает нормально. Но когда я пытаюсь превратить его в подобную слезе вещь (см. Здесь для большего контекста: 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);

Когда я запускаю код, он сильно искажается и даже не выглядит как слеза! Вот как это выглядит:

Distorted looking image

Затем я попытался исправить это, реализовав код ответа, вот код:

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

Но, хотя он выглядит перевернутым, он все же искажен и не похож на слезу. Вот фото:

Distorted Inverted Mandelbrot.

Что-то не так сделал при реализации кода?

1 Ответ

3 голосов
/ 18 мая 2019

Нам нужно думать о c как о комплексном числе, поэтому в обычном случае Мандельброта мы имеем:

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 с комплексными числами, это простое изменение по сравнению с обычным Мандельбротом:

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):
    # ...

Но если мы сами реализуем комплексные числа, то для нормального Мандельброта мы делаем:

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

и для перевернутого Мандельброта мы делаем:

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

enter image description here

...