モノクロタイム

I'm from the future!

ジェネラティブアート(普及版)読む・Part3,Chapter6

いつの間にか半分以上読み進めてました. 今日はPart3,Chapter6を読みましたよ.

Part3 複雑性

Chapter6 創発

低いレベルでの単純なルールが,高いレベルの組織化された複雑さを生み出す現象を「創発」と呼びます.

本中の例を挙げるなら,ムクドリが群れをなして飛ぶ様子が正に創発である.らしい. 1羽1羽のムクドリは,群れのリーダーが進む方向に従って飛ぶわけではなく,自身に最も近い個体の飛ぶ方向やスピードだけを参考に自身の進む方向を決める.このルールで飛ぶムクドリが群れをなして飛ぶことで,群れの固まりが面白い動きを見せてくれる,とのこと.

Part3では創発によって生み出される複雑な動きや物事を,創発的複雑性という言葉で定義してある.そしてこの創発的複雑性をコーディングによって生み出していくことが本Partの目標.

なのだが,まず最初にProcessingでのオブジェクト指向プログラミングについて解説している.私は何度かProcessingでコードを書いたことがあるし,大学のProcessingを使用した演習でも知らず知らずのうちにオブジェクト指向なコードを書かされていたので,ウンウンと頷きながら流し読み.

コードも色々書いてあったけど,適当な例を用いてオブジェクト指向プログラミングについて解説してあったというような感じ. Javaベースのプログラミング言語なので,Javaがわかっている人はもちろん,何らかの言語でプログラムを書いたことがある人はなんとなくわかるんじゃないかな.

オブジェクト指向なコードと,実行例は以下のとおり.

int _num = 10;
Circle[] _circleArr = {};
void setup() {
  size(500,300);
  background(255);
  smooth();
  strokeWeight(1);
  fill(150, 50);
  drawCircles();
}
void draw() {
  background(255);
  for (int i=0; i<_circleArr.length; i++) {
    Circle thisCirc = _circleArr[i];
    thisCirc.updateMe();
  }
}
void mouseReleased() {
  drawCircles();
}
void drawCircles() {
  for (int i=0; i<_num; i++) {
Circle thisCirc = new Circle();
thisCirc.drawMe();
_circleArr = (Circle[])append(_circleArr, thisCirc);
} }
//================================= objects
class Circle {
  float x, y;
float radius;
color linecol, fillcol; float alph;
float xmove, ymove;
Circle () {
x = random(width);
y = random(height);
radius = random(100) + 10;
linecol = color(random(255), random(255), random(255)); fillcol = color(random(255), random(255), random(255)); alph = random(255);
xmove = random(10) - 5;
ymove = random(10) - 5;
}
     void drawMe() {
       noStroke();
       fill(fillcol, alph);
       ellipse(x, y, radius*2, radius*2);
       stroke(linecol, 150);
noFill();
       ellipse(x, y, 10, 10);
     }
     void updateMe() {
       x += xmove;
       y += ymove;
       if (x > (width+radius)) { x = 0 - radius; }
       if (x < (0-radius)) { x = width+radius; }
       if (y > (height+radius)) { y = 0 - radius; }
       if (y < (0-radius)) { y = height+radius; }
drawMe(); }
}

f:id:yomoyamareiji:20150219155506p:plain

実際はアニメーションになっていて,円が画面上をスイスイ動いています.

このChapterではムクドリの例のような創発を実現するためのオブジェクト指向(単純な動きをするオブジェクトが美しいスケッチを生み出す)について記述してあった.まだプログラミングの入門書を抜け切れていない感じがする. 次のChapterから,予測不可能性・ランダム性を加えた,より洗練されたアートについて触れていくのだと思う.

次のChapter7は自立性というタイトルが付いている.セル・オートマトンについても触れられているようだし,読むのが楽しみ.

ではでは〜