Processing:Примеры/Множество Мандельброта
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Описание[1]
Этот скетч-пример просто рендерит множество Мандельброта.
Пример
size(640, 360);
noLoop();
background(255);
// Задаем диапазон значений на комплексной плоскости.
// Благодаря этому мы сможем «зуммировать» фрактал.
// начинаем с ширины;
// попробуйте задать вместо «4» какое-то другое значение:
float w = 4;
float h = (w * height) / width;
// начнем с отрицательной половины диапазонов ширины и высоты:
float xmin = -w/2;
float ymin = -h/2;
// Загружаем в массив pixels[] текущее изображение на экране.
// Это нужно сделать только единожды,
// потому что мы не собираемся ничего рисовать.
loadPixels();
// максимальное количество итераций (проходов)
// для каждой точки на комплексной плоскости:
int maxiterations = 100;
// значение «x» будет варьироваться от «xmin» до «xmax»:
float xmax = xmin + w;
// значение «y» будет варьироваться от «ymin» до «ymax»:
float ymax = ymin + h;
// рассчитываем значения для инкрементирования по осям X и Y:
float dx = (xmax - xmin) / (width);
float dy = (ymax - ymin) / (height);
// проходим через ось Y:
float y = ymin;
for (int j = 0; j < height; j++) {
// проходим через ось X:
float x = xmin;
for (int i = 0; i < width; i++) {
// теперь, итерируя пиксель с помощью формулы z = z^2 + cm,
// проверяем, стремятся ли его координаты («z») к бесконечности:
float a = x;
float b = y;
int n = 0;
while (n < maxiterations) {
float aa = a * a;
float bb = b * b;
float twoab = 2.0 * a * b;
a = aa - bb + x;
b = twoab + y;
// давайте представим,
// что в нашем конечном мире бесконечность – это «16»:
if (dist(aa, bb, 0, 0) > 16.0) {
break; // стремится к бесконечности
}
n++;
}
// задаем цвет пикселя в зависимости от того,
// как быстро он добрался до бесконечности
// (то есть сколько итераций ему для этого потребовалось);
// если пиксель никогда до бесконечности не доберется
// (т.е. если он прошел максимальное количество итераций,
// но до бесконечности так и не добрался),
// окрашиваем его в черный цвет:
if (n == maxiterations) {
pixels[i+j*width] = color(0);
} else {
// окрашиваем добравшийся до бесконечности пиксель
// в соответствующий оттенок серого:
float norm = map(n, 0, maxiterations, 0, 1);
pixels[i+j*width] = color(map(sqrt(norm), 0, 1, 0, 255));
}
x += dx;
}
y += dy;
}
updatePixels();
См.также
Внешние ссылки
Примеры на Processing | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |