Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Множество Мандельброта

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Описание[1]

Этот скетч-пример просто рендерит множество Мандельброта.

Пример

  1. size(640, 360);
  2. noLoop();
  3. background(255);
  4.  
  5. // Задаем диапазон значений на комплексной плоскости.
  6. // Благодаря этому мы сможем «зуммировать» фрактал.
  7.  
  8. // начинаем с ширины;
  9. // попробуйте задать вместо «4» какое-то другое значение:
  10. float w = 4;
  11. float h = (w * height) / width;
  12.  
  13. // начнем с отрицательной половины диапазонов ширины и высоты:
  14. float xmin = -w/2;
  15. float ymin = -h/2;
  16.  
  17. // Загружаем в массив pixels[] текущее изображение на экране.
  18. // Это нужно сделать только единожды,
  19. // потому что мы не собираемся ничего рисовать.
  20. loadPixels();
  21.  
  22. // максимальное количество итераций (проходов)
  23. // для каждой точки на комплексной плоскости:
  24. int maxiterations = 100;
  25.  
  26. // значение «x» будет варьироваться от «xmin» до «xmax»:
  27. float xmax = xmin + w;
  28. // значение «y» будет варьироваться от «ymin» до «ymax»:
  29. float ymax = ymin + h;
  30.  
  31. // рассчитываем значения для инкрементирования по осям X и Y:
  32. float dx = (xmax - xmin) / (width);
  33. float dy = (ymax - ymin) / (height);
  34.  
  35. // проходим через ось Y:
  36. float y = ymin;
  37. for (int j = 0; j < height; j++) {
  38.   // проходим через ось X:
  39.   float x = xmin;
  40.   for (int i = 0; i < width; i++) {
  41.  
  42.     // теперь, итерируя пиксель с помощью формулы z = z^2 + cm,
  43.     // проверяем, стремятся ли его координаты («z») к бесконечности:
  44.     float a = x;
  45.     float b = y;
  46.     int n = 0;
  47.     while (n < maxiterations) {
  48.       float aa = a * a;
  49.       float bb = b * b;
  50.       float twoab = 2.0 * a * b;
  51.       a = aa - bb + x;
  52.       b = twoab + y;
  53.       // давайте представим,
  54.       // что в нашем конечном мире бесконечность – это «16»:
  55.       if (dist(aa, bb, 0, 0) > 16.0) {
  56.         break;  // стремится к бесконечности
  57.       }
  58.       n++;
  59.     }
  60.  
  61.     // задаем цвет пикселя в зависимости от того,
  62.     // как быстро он добрался до бесконечности
  63.     // (то есть сколько итераций ему для этого потребовалось);
  64.     // если пиксель никогда до бесконечности не доберется
  65.     // (т.е. если он прошел максимальное количество итераций,
  66.     // но до бесконечности так и не добрался),
  67.     // окрашиваем его в черный цвет:
  68.     if (n == maxiterations) {
  69.       pixels[i+j*width] = color(0);
  70.     } else {
  71.       // окрашиваем добравшийся до бесконечности пиксель
  72.       // в соответствующий оттенок серого:
  73.       float norm = map(n, 0, maxiterations, 0, 1);
  74.       pixels[i+j*width] = color(map(sqrt(norm), 0, 1, 0, 255));
  75.     }
  76.     x += dx;
  77.   }
  78.   y += dy;
  79. }
  80. updatePixels();

См.также

Внешние ссылки

  1. processing.org - The Mandelbrot Set by Daniel Shiffman.