Мой Мандельброт выглядит не так, как должен. Кто-нибудь знает почему? - PullRequest
1 голос
/ 04 августа 2020

Недавно я узнал о наборе Мандельброта, и теперь я пытаюсь сгенерировать набор Мандельброта в Processing 3.0. Я нашел учебник на youtube о его программировании и попытался реализовать его в Progressing.

  background(255);
  size(1280, 720);
}

void draw(){
    int maxIteration = 100;
  
    double reMid = -0.75;
    double iMid = 0;
    
    double rangeR = 3.5;
    double rangeI = 2;
    
    double xPixels = 1280;
    double yPixels = 720;
    
    for(int x = 0; x < xPixels; x++){
        for(int y = 0; y < yPixels; y++){
            double xP       = (double)x / xPixels;
            double yP       = (double)y / yPixels;
          
            double cReal    = xP * rangeR + reMid - rangeR / 2;
            double cIm      = yP * rangeI + iMid - rangeI  / 2;
          
            double zReal    = 0;
            double zIm      = 0;
          
            int iteration   = 0;
            while(iteration < maxIteration && zReal * zReal + zIm * zIm <= 4) {
                double temp = zReal * zReal - cIm * cIm + cReal;
                zIm         = 2 * zReal * zIm + cIm;
                zReal       = temp;
                
                iteration++;
            }
            
            if(iteration >= maxIteration - 1){
                stroke(0);
            }
            else{
                stroke(255);
            }

            point(x, y);
        }
    }

}

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

img

Я уже сравнивал свой код с кодом на видео, но я не нашел ошибки в своем коде. Кто-нибудь знает, что я сделал не так?

1 Ответ

2 голосов
/ 04 августа 2020

Я немного уменьшил масштаб, и длинные хвосты продолжают уходить в бесконечность. Поскольку все |C| > 2 должны расходиться, это позволяет легко найти конкретный случай c, который не работает, например cReal = 2; cImg = -1.5;

. Ваш код говорит, что он сходится, но выполнение этого вручную показывает, что он расходится очень быстро :

Z0 = 0 + 0i
Z1 = (0 + 0i)^2 + 2 - 1.5i = 2 - 1.5i
Z2 = 2*2 - 2*2*1.5i - 1.5^2 = 1.75 - 6i

Пошаговое выполнение кода дает zReal, zImg

-1.5, -0.25
-0.75, -0.1875
-1.21875, -0.21484375
-0.976318359375, -0.2038421630859375
-1.1019703075289726, -0.20844837254844606
[...]

Другими словами, ваш l oop неверен. Сразу подозреваемая строка кода следующая:

double temp = zReal * zReal - cIm * cIm + cReal;

Он выполняет cIm*cIm, но не должно быть никакого умножения каких-либо компонентов C: он просто добавляется в конце.

Так случилось, что вы случайно поменяли zIm на cIm.

Переключите их обратно, и вы должны получить лучший результат:

double temp = zReal * zReal - zIm * zIm + cReal;
...