Рубрики
Без рубрики

Фрактальная игровая площадка с обработкой

От 0 до фракталов. Помечено как обработка, java, развлечения, программирование.

Ооочень Обработка довольно крутая. Впервые я наткнулся на него, когда 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”