日常の進捗

行為と記録とその習慣化

Mod: Coding Challenge #12: The Lorenz Attractor in Processing

f:id:takawo:20170911082727g:plain

数式を使って描画する方向では、ローレンツ・アトラクターは結構有名。

ローレンツ方程式 - Wikipedia The Lorenz Attractor, a thing of beauty

上のPaul Bourkeさんが書いてるエントリに載っているCでの実装をProcessingでポーティングしたような感じ。例によってPeasyCamを使っているのでGIFで。

このへんのフラクタルやカオスをプログラミングで使用する例は、C→Processingで永松さんがやっている。綺麗。

フラクタル、カオスをProcessingで記述する – 永松 歩 | Ayumu Nagamatsu

コード

import peasy.*;

float x = 0.01;
float y = 0;
float z = 0;

float a = 10;
float b = 28;
float c = 8.0/3.0;

float scale = 10;

ArrayList<PVector> points = new ArrayList<PVector>();
PeasyCam cam;

// setup関数 : 初回1度だけ実行される
void setup() {
  size(960, 540, P3D); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100); // HSBでの色指定にする

  cam = new PeasyCam(this, 500);  
  background(0, 0, 0);
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  background(0, 0, 0);

  float dt = 0.01;
  float dx = (a * (y - x)) * dt;
  float dy = (x * (b - z) - y) * dt;
  float dz = (x * y - c * z) * dt;
  x = x + dx;
  y = y + dy;
  z = z + dz;
  points.add(new PVector(x, y, z).mult(5));

  translate(0, 0, -80);
  noFill();
  stroke(0, 0, 100);

  float hue = 0;

  beginShape();
  for (PVector p : points) {
    stroke(hue, 80, 100);
    vertex(p.x, p.y, p.z);
    //PVector offset = PVector.random3D();
    //offset.mult(0.1);
    //p.add(offset);

    hue = (hue + 0.1)%360;
  }
  endShape();
}  

リファレンス