日常の進捗

主に自分のための,行為とその習慣化の記録

Mod:Coding Challenge #21: Mandelbrot Set with p5.js

マンデルブロ集合。正直な所、昔からあんまり綺麗だなと思えなかったけど、漸化式の復習と考えたら面白く感じる部分もあった。関数mandelbrot()の中で繰り返し実行している。他のマンデルブロ集合をProcessingで記述する例を幾つかチェックして理解しながら進めた。動画で紹介されているコードの書き方とかなり違ったものになった。

追記:ブノワ・マンデルブロ本人が解説している動画(!)があったので観た。為替相場の研究を始めたところからフラクタルにつながっていくところは面白い。興味を持てたことが次のモチベーションにつながる。

コード

int maxIteration = 100;
int limit = 100;

float scale = 3.5;

void setup() {
  size(600, 600);
  colorMode(HSB, 360, 100, 100);
}

void draw() {
  background(0, 0, 100);
  loadPixels();
  for (int j = -height/2; j < height/2; j++) {
    for (int i = -width/2; i < width/2; i++) {
      float x = scale * i / width;
      float y = scale * j / height;

      float brightness = mandelbrot(x, y);
      int px = i + width/2;
      int py = j + height/2;
      color c = color(0, 0, brightness%100);
      pixels[px + py * width] = c;
    }
  }
  updatePixels();
}

float mandelbrot(float x0, float y0) {
  float tx;
  float ty;
  float zx = 0;
  float zy = 0;
  for (float i = 0; i < maxIteration; i++) {
    tx = zx;
    ty = zy;

    zx = tx * tx - ty * ty + x0;
    zy = 2 * tx * ty + y0;

    if (zx * zx + zy * zy > limit) {
      return i;
    }
  }
  return 0f;
}

リファレンス