Мандельброт набор визуализации - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь визуализировать сет Мандельброта с обработкой, и я впервые делаю что-то подобное. Мой подход довольно прост. У меня есть функция Z, которая буквально является основной функцией набора (f(z)=z^2+c), и я делаю все oop для каждого пикселя экрана, каждый раз, когда я повторяю процесс использования Z () и использования результата в качестве новый параметр z в функции Z () По какой-то причине на экране отображается только диагональная линия, и я понятия не имею, почему это так.

Вот полный код:

void draw() {

int max_iterations = 100, infinity_treshold = 16;
for (int y = 0; y < 360; y++) {
  for (int x = 0; x < 480; x++) {

    float z = 0; // the result of the function, (y)
    float real = map(x,0,480,-2,2); // map "scales" the coordinate as if the pixel 0 was -2 and the pixel 480 was 2
    float imaginary = map(y,0,360,-2,2); // same thing with the height
    int func_iterations = 0; // how many times the process of the equation has been excecuted

    while (func_iterations < max_iterations) {
      z = Z(z, real+imaginary);
      if (abs(z) > infinity_treshold) break;
      func_iterations++;
    }

    if (func_iterations == max_iterations) rect(x,y,1,1);
    }
  }
  noLoop();
}

private float Z(float z, float c) {
  return pow(z,2)+c;
}

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Формула z = z^2 +c предназначена для работы с Комплексными числами . Я рекомендую использовать PVector для представления комплексного числа. Например:

private PVector Z(PVector z, PVector c) {
    return new PVector(z.x * z.x - z.y * z.y + c.x, 2.0 * z.x * z.y + c.y);
}

См. пример:

void setup() {
    size(400, 400);
}

void draw() {

    background(255);
    int max_iterations = 100;
    float infinity_treshold = 16.0;
    for (int y = 0; y < width; y++) {
        for (int x = 0; x < height; x++) {

            float real = map(x, 0, width, -2.5, 1.5); 
            float imaginary = map(y, 0, height, -2, 2); 
            PVector c = new PVector(real, imaginary);
            PVector z = new PVector(0, 0);

            int func_iterations = 0; 
            while (func_iterations < max_iterations) {
                z = Z(z, c);
                if (z.magSq() > infinity_treshold)
                    break;
                func_iterations++;
            }

            if (func_iterations == max_iterations) {
                point(x, y);
            }
        }
    }
    noLoop();
}

private PVector Z(PVector z, PVector c) {
    return new PVector(z.x * z.x - z.y * z.y + c.x, 2.0 * z.x * z.y + c.y);
}

См. также
Википедия - набор Мандельброта
Мандельброт. java

0 голосов
/ 22 марта 2020

Вы объявили z как float, так что это действительное число, оно должно быть сложным. Я не знаком с обработкой, у нее даже есть тип данных с комплексным числом?

Другая проблема в Z(z, real+imaginary) Реальные и мнимые - это числа с плавающей точкой, поэтому действительные числа, поэтому их сумма является действительным числом. Вам нужно построить комплексное число из действительной и мнимой частей.

...