Ооочень Обработка довольно крутая. Впервые я наткнулся на него, когда Daniel Shiffman был рекомендован в моем канале YouTube, и с тех пор мне было очень весело с ним. Короче говоря: это Java sketchbook, который позволяет любому создавать интерактивные и визуальные эскизы в 2D/3D пространстве. Он очень мощный, и с ним очень легко начать работу.
Выше приведена программа рисования голых костей, созданная всего за несколько строк кода. Обработка может предложить гораздо больше, но в этом посте я расскажу вам о создании фракталов из простых фигур.
Но прежде чем мы начнем лихорадочно искать в StackOverflow ошибки компилятора Java, давайте поговорим о том, как создается фрактал.
Фрактал – это простой паттерн, управляемый рекурсией (не паникуйте). Рассмотрим рекурсивный образ:
Потратьте секунду, чтобы подумать о том, как вы могли бы реализовать что-то подобное. Что определяет следующий шаг в последовательности? Как мы можем убедиться, что квадраты не перекрываются?
Как только вы подумаете о том, как бы вы это сделали, отбросьте это, потому что, если вы не сказали “перемещать начало координат на каждом шаге”, это, вероятно, будет хлопотно. Хитрость рекурсивных функций при обработке заключается в том, чтобы отслеживать ваше происхождение. Вот тот же эскиз, что и раньше, но с красным кругом, который следует за началом координат на каждой итерации.
При обработке функция для перемещения источника – translate(...)
, и translate(...)
– это функция, которая сдвигает начало координат относительно его предыдущей позиции. Например: translate(3, 9)
переместит начало координат на 3 вправо и на 9 вниз.
Давайте закодируем
Приведенный выше пример масштабирования квадратов – разумный первый шаг, так что именно с него мы и начнем.
void setup() { size(1000, 250); } void draw() { scalingSquares(200); // we'll define this function next // it'll be called once per frame }
Эти две функции являются сердцем и душой ваших эскизов обработки, поэтому старайтесь содержать их в чистоте.
Мы собираемся поместить код, ответственный за рисование квадратов, в его собственную функцию, называемую масштабирование квадратов (...)
.
void scalingSquares(float n) { rect(0, 0, n, n); translate(n + 5, n / 8); }
Если вы попробовали это с 200 в качестве аргумента в draw()
, ожидайте увидеть:
У нас есть все необходимое для завершения масштабирования квадратов, кроме ключевого ингредиента … рекурсии!
Путем добавления этих двух строк…
void scalingSquares(float n) { + if (n < 30) return; // don't draw squares that are less than 30x30 rect(0, 0, n, n); // translate(n + 5, n / 8); // offset each square by itself + 5px // and move each square down 1/8 to vertically align // + scalingSquares(n * 0.75); // each square is 75% the size of the one before it }
Мы получили нашу функциональность масштабирования квадратов с помощью рекурсивной функции.
Важно отметить, что значение передается в |/масштабирование квадратов (…) внутри
масштабирование квадратов(…) . Это исходный аргумент, умноженный на 0,75, чтобы уменьшить масштабный коэффициент, входящий в рекурсивную функцию, до тех пор, пока он не станет меньше 30 пикселей.
Лучшие фракталы?
Если вы провели какое-то время в Интернете, вы знаете, что это вряд ли фрактал. Чтобы создать более сложные фракталы, добавьте PushMatrix()
и PopMatrix()
в ваш арсенал было бы разумно. PushMatrix()
сохраняет текущую исходную точку и свойства сетки в стеке вне экрана, а PopMatrix()
восстанавливает исходную точку и сетку до последней сохраненной. Думайте о PushMatrix()
как о функции сохранения и PopMatrix()
как о функции загрузки для сетки.
void setup() { size(700, 700); } void draw() { background(255); noFill(); translate(width / 2, height / 2); // move origin to middle of canvas draw_fractal(500); } void draw_fractal(float r) { ellipse(0, 0, r, r); // draw origin circle if (r < 100) // don't draw circles smaller than 100x100 return; stroke(255, 0, 0); // red circles pushMatrix(); // save the origin, we're about to change it translate(0, -r / 4); // move the origin straight down to the 1/4 mark draw_fractal(r / 2); // restart the process at half the scale popMatrix(); stroke(0, 0, 255); // blue circles pushMatrix(); translate(0, r / 4); draw_fractal(r / 2); popMatrix(); stroke(0, 255, 0); // green circles pushMatrix(); translate(r / 4, 0); draw_fractal(r / 2); popMatrix(); stroke(0); // black circles pushMatrix(); translate(-r / 4, 0); draw_fractal(r / 2); popMatrix(); }
Этот рекурсивный код имеет следующий вывод:
Красный: Верхние круги Синий: Нижние круги Зеленый: Правые круги Черные: Левые круги
С исходными маркерами:
Вывод
Я надеюсь, что это было интересное чтение и хорошее введение в визуализацию в коде. Обработка хороша не только для создания тройных фракталов, это также инструмент для визуализации данных новыми и интересными способами. Существует множество фрагментов фракталов, свободно доступных в Интернете для обработки, но у вас есть мотивация создать свой собственный и поделиться им здесь, если вы придумаете что-то классное! Вес удара(...)
, инсульт(...)
, noFill()
, fill(...)
и background(...)
может быть интересно настроить для добавления большего количества цвета. Для получения дополнительной документации ознакомьтесь с Обработка веб-сайта .
Оригинал: “https://dev.to/zanehelton/a-fractal-playground-with-processing-54gk”