GenerativeArtに触れてみたので環境構築と感想など

![g_art_1889.jpg](https://qiita-image-store.s3.amazonaws.com/0/122197/55f07915-d70e-cbd8-de8e-4b24a75ab827.jpeg)

#はじめに
大学時代に舞台を作ったりしていたので、最近メディアアート系にちょっと興味が湧きました。
そこで、仕事終わりに１週間ほどGenerativeArtを触ってみました。

以下の本を読んだので、その紹介をします。

[[普及版]ジェネラティブ・アート―Processingによる実践ガイド](https://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634)

下記サイトで
- Introduction
- Chapter1
- Chapter6
は無料で見ることができるようです。

http://zenbullets.com/book.php

##自己紹介

大阪のエンジニアで2年目になろうかといういわゆる新人です。
なので間違い、指摘等ありましたらコメントいただけると嬉しいです。

##GenerativeArtとは

厳密な定義は本を読んでいただくのが一番ですが、
ざっくり言うとプログラムから作るアート作品です。

具体的には、下記のような作品などです。

![g_art_000.jpg](https://qiita-image-store.s3.amazonaws.com/0/122197/dc7fd924-d81d-4b24-2927-b778647b487e.jpeg)

ボタンをポチッとするだけで毎回違った作品が生まれてくるのがすごく素敵ですね。

##Processingとは
Javaの上に作られた言語です。

なのでJavaっぽい構文で書きますが、
教育用、ノンプログラマーであるアーティスト用に開発されているため、
かなり直感的に書くことができます。

なので、Processingを使うとGenerativeArtのような作品は作りやすいみたいですが、
他の言語でももちろん作品は作れます。

#Processingのインストール

私の環境：OS X EL Captain 10.11.6
上記を前提に記載しています。

[Download Processing](https://processing.org/download/)
上記から、Ver3.3.4(2017年6月9日時点)をダウンロードしました。

ダウンロードしたら、解凍すると
Processing.appができるので、
それをアプリケーションフォルダに入れて実行するだけです。簡単でした。

私は、入力補完をして欲しかったので、下記を参考に、
Sublime Text3で実行しました。

[エディタとして Sublime Text 2 を利用する](http://www.d-improvement.jp/learning/processing/tutorial/sublime-text-2.html)

設定が完了すれば、Sublime Text3上でCtrl + Bで実行できるので楽チンです。

#本の章構成

|章|概要                                               |
|:-------------:|:-------------------------------------------------|
|Introduction Chapter1|そもそもGenerativeArtとは何か、について記載されています。|
|Chapter2|Processingの導入方法、使い方についてです。|
|Chapter3|そもそも、『線を引く』、ということはなんなのかを再定義します。線を引くという行為の中にランダム性を導入し、作品が勝手に動き出すようになっていきます。|
|Chapter4|次は、線から進んで、円を描く中にもランダム性を盛り込みます。|
|Chapter5|線や円は２次元でしたが、奥行きを足すことで３次元空間を作り、球を描きます。その中に複雑性、ランダム性を持ち込みます。|
|Chapter6|オブジェクト思考（ただしクラスとインスタンスのみ）を導入し、物体同士がインタラクションすることによる複雑性を作り出していきます。|
|Chapter7|ライフゲーム(※)を作り、そこにVisual的な要素を追加していくことで、見てて飽きない不思議な自律性を発見できます。|
|Chapter8|フラクタル(※)について考えていきます。回帰的なコーディングによって、美しい自己相似を発見することができます。|

(※)ライフゲーム：眺めているだけで面白い、セルオートマトンの一種です。詳しくは[ライフゲームの奥深さ。単純なルールでフラクタルや自己複製が起きる神秘](http://www.ochearno.net/entry/interesting_world_of_life_game)を読んでみてください。

(※)フラクタル：葉っぱや木の枝の生え方など、部分的に見えている形が全体の形と相似になっている幾何学という学問で使われる専門用語。（説明が難しい。。。）

**注意点**
本に記載されているコードは、インデントが崩れていたり、強調されていない部分がさらっと書き換わっていたりするので、ご注意ください。。

#Chapter6のコードはこちら

無料部分なので、私が書いたコードを載せておきます。

```java:

// グローバル変数
int _num = 10;
Circle[] _circleArr = {};

//setup()は起動時に１回だけ呼ばれる関数です
void setup() {
    size(500, 300); //キャンバスの大きさを指定
    background(255); //背景を白紙に設定。RGBで（255, 255, 255）を指定と同じ意味になる
    smooth(); //アンチエイリアスを有効に
    strokeWeight(1); //線の太さを設定
    fill(150, 50); //塗りつぶしの設定。fill(150, 150, 150, 50)と同じ。前の３つはRGBの値で、4つ目は透明度
    drawCircles(); //_numの数だけ新しい円を作成する自作の関数
  }

//draw()は毎フレーム呼ばれる関数です
  void draw() {
    background(255); //背景を白紙に戻す
    for (int i = 0; i < _circleArr.length; ++i) {
        Circle thisCirc = _circleArr[i];
        thisCirc.updateMe();
    }
    drawCircles();
}

//mouseReleased()はマウスをクリックし、話した瞬間に呼ばれる関数です
void mouseReleased() {
    drawCircles();
    println("circle_num : "+_circleArr.length);
}

void drawCircles() {
    for (int i = 0; i < _num; ++i) {
        Circle thisCirc = new Circle();
        thisCirc.drawMe();
        _circleArr = (Circle[])append(_circleArr, thisCirc);
    }
}

//Circleクラスを定義
class Circle {
    float x, y, radius,alph;
    color linecol, fillcol;
    float xmove, ymove;
    float dis, overlap;

    //Circleクラスのコンストラクタ。new Circle()した瞬間に呼ばれます
    Circle () {
        x = random(width); //widthはキャンバスの横の大きさ。定義しなくても使える
        y = random(height); //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); //x, y の位置に、直径がraduis*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 > (width+radius)) { y = 0 - radius; }
        if (y < (0-radius)) { x = width+radius; }

        boolean touching = false;
        for (int i = 0; i < _circleArr.length; ++i) {
            Circle otherCirc = _circleArr[i];
            if (otherCirc != this) {
                dis = dist(x, y, otherCirc.x, otherCirc.y);
                overlap = dis - radius - otherCirc.radius;
                if (overlap < 0) {
                    touching = true;
                    float midx, midy;
                    midx = (x + otherCirc.x)/2;
                    midy = (y + otherCirc.y)/2;
                    stroke(0, 100);
                    noFill();
                    overlap *= -1;
                    ellipse(midx, midy, overlap, overlap);
                }
            }
        }
    }
}
```

結果はこんな感じになります。
クリックするたびに円が増えていきます。実際に動かしてみたらとても綺麗です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">眺めてるだけで楽しい <a href="https://t.co/hzgJkvnbZQ">pic.twitter.com/hzgJkvnbZQ</a></p>&mdash; いのしかちょう (@pie_equal_3_red) <a href="https://twitter.com/pie_equal_3_red/status/873803964088766464">2017年6月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>



#他にも作ったもの

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">思ってたのと違うけどキレイ <a href="https://t.co/zMyWDXS7ky">pic.twitter.com/zMyWDXS7ky</a></p>&mdash; いのしかちょう (@pie_equal_3_red) <a href="https://twitter.com/pie_equal_3_red/status/873402322495221760">2017年6月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset![export-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/122197/783fd740-3c0b-5d43-5a34-ca4b5e454f86.gif)
="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">（ムスカ風に）素晴らしい...!! <a href="https://t.co/WaQV28gkLz">pic.twitter.com/WaQV28gkLz</a></p>&mdash; いのしかちょう (@pie_equal_3_red) <a href="https://twitter.com/pie_equal_3_red/status/873747014101590016">2017年6月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8">


#感想

アートということもあって、非常に哲学的なテーマとなっています。
一部の章では、自然現象をプログラムに落とし込むことについて書かれていたりするのですが、真剣に考え出すととても難解です。
筆者は、「そもそもなぜ」という考え方によって、行為そのものを再定義したり、制約を外したりすることによって、どんどんアイデアを拡大させており、
美しい作品を生み出すコードをたくさん教えてもらいました。
現時点では、とりあえずコードの写経にとどまってしまっていますが、自分なりの法則を創造することで、クリエイティブなアーティストに近づけるのかなと思いました。


以上です。初投稿で拙い文章でしたが、最後までお読みいただきありがとうございました。