子供と遊ぶJavaScriptとアート

この記事は[Brainpad Advent Calendar 2018](https://qiita.com/advent-calendar/2018/brainpad)の15日目の記事です。

# 0. はじめに
こんにちは。チンバトです。ソフトウエアエンジニアやっています。二人の子供の父親です。子供達にはパソコンやスホマはあまり見せないようにしていまして、子供達は操作方法すらわかりません。しかし、上の子がもう4歳ですし、そろそろ操作方法ぐらいは教えてあげてもいいんじゃないかなと思いました。そして、**子供がマウス操作の練習として使えて、かつ、すぐ飽きないようにちょっとクリエイティブな何かをJavaScriptで作って子供と一緒に遊びました**（今の時代タッチパネルでよくない？とも思いましたが、歴史的背景から教えることにします）。

# 1. 環境について

ブラウザ上でJavaScriptを動かす感じでやります。コードは[codepen](https://codepen.io/)におきますが、かなり汚いので参考程度でお願いします。

# 2. マウス操作

## カーソル移動とクリック
様々な色からカーソルを移動させて好きな色まで持って行き、クリックすることで色の選択ができて、絵を描くツールを作りました。
<img width="800" alt="Screen Shot 2018-12-14 at 0.16.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/100781/8512b7ac-5a1e-507e-0c31-802a2c6da94b.png">
これは[Pixel Art](https://en.wikipedia.org/wiki/Pixel_art)的な感じで、物事を抽象的にみて描く必要があるので子供にとって面白いのではないかと思います。コードは[codepen](https://codepen.io/chinbaa_chi/pen/jXWgRX)にあります。

さっそく4歳の娘に使ってもらいました。結果、以下の絵を描いてくれました。

<img width="300" alt="Screen Shot 2018-12-14 at 20.02.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/100781/067c829c-a257-1260-9b11-dfed564a535b.png">

これは「花」らしいです。また、必死にマウス移動やクリックに集中する姿が素敵でした。

## ドラッグ & ドロップ
線で結ばれた幾つかの点をドラッグ&ドロップすることで何かの形を作るツールを作りました。
<img width="800" border="1" alt="Screenshot from 2018-12-14 15-50-51.png" src="https://qiita-image-store.s3.amazonaws.com/0/100781/85b8b11a-60b4-d6fe-4132-8d577d64365d.png">

これも作れる形が自由なので子供にとって面白いのではないかなと思います。コードは[codepen](https://codepen.io/chinbaa_chi/pen/KbVBga)にあります（[interact.js](http://interactjs.io/)というライブラリを使っています）。

さっそく娘に使ってもらおうとしましたが、ドラッグ&ドロップ操作は難しいようで、かなり苦労していました。結果、娘が作りたい形を一緒に作ることにしました。

<img width="300" alt="Screen Shot 2018-12-14 at 20.36.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/100781/7a329705-fa49-e59d-f130-9711c989c839.png">

これは[Peppa Pig](https://en.wikipedia.org/wiki/Peppa_Pig)と呼ばれるキャラクターで以下が本当の画像です

<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/100781/ec76e070-9cc6-4dfb-68f5-ca45f11f2062.jpeg">

娘はドラッグ&ドロップ操作でかなりストレスが溜まったらしく、疲れた様子でした :blush:

# 3. アートっぽい何か

JavaScriptで色々遊んでいたら、Generative Artというものがあることを知りました。
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%BC%E3%83%88)によると：
> ジェネレーティブアートまたはジェネラティブアート（英: Generative Art）は、コンピュータソフトウェアのアルゴリズムや数学的/機械的/無作為的自律過程によってアルゴリズム的に生成・合成・構築される芸術作品を指す。コンピュータの計算の自由度と計算速度を活かし、自然科学で得られた理論を実行することで、人工と自然の中間のような、統一感を持った有機的な表現を行わせる作品が多い。

だそうです。文書は分かりにくいと思いますので、[画像検索でググッてみてください](https://www.google.mn/search?q=generative+art&source=lnms&tbm=isch&sa=X&ved=0ahUKEwijufKckY7fAhXIVrwKHQj4BMUQ_AUIDigB&cshid=1544200252350000&biw=1245&bih=668)。お分かりでしょうか？なんかプログラムを書いてアートっぽい何かを作るらしいです。娘にもいくつか絵を描いてあげました。

## 太陽の光
![Screenshot from 2018-12-14 16-54-40.png](https://qiita-image-store.s3.amazonaws.com/0/100781/4fd06289-ec34-fa65-0386-859faecdbb9a.png)

10行ぐらいの[コード](https://codepen.io/chinbaa_chi/pen/MZYLGO)ですが（[p5.js](https://p5js.org/)というライブラリを使っています）、ちゃんと動いているようにも見えていい感じですね。

## よくわからないパターン

<img width="400" alt="Screen Shot 2018-12-14 at 18.59.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/100781/2887fc05-f23d-2fa7-2b07-5e8257ff84f4.png">

適当に円を書いただけですが、何かすごい！[コード](https://codepen.io/chinbaa_chi/pen/xmZOWM)はこんなにシンプルです（こちらも[p5.js](https://p5js.org/)を使っています）。

## お花

![Screenshot from 2018-12-14 16-33-49.png](https://qiita-image-store.s3.amazonaws.com/0/100781/cecea518-a1a7-3fe3-b8c6-d646f0fd19a3.png)

これは娘に何を描いてほしいか注文受けて描いた絵です。ループとランダム数と幾何関数だけ使ったわりにはいい感じではないでしょうか？少なくても娘と私は感動しました。コードは[codepen](https://codepen.io/chinbaa_chi/pen/yGyQrW)にあります（こちらも[p5.js](https://p5js.org/)を使っています）。

# まとめ

娘にパソコンの簡単な操作を教える目的で始まったJavaScript遊びがプログラミングによるアート作成まで拡大してしまいました。結果的に娘が「パパすごい！」と言ってくれたので私はかなり満足しています。プログラムで作るアートは仕事と違って仕様がないですし、正解がないので気軽にコードが書けて楽しかったです。また機会があればGenerative Art周りでいろいろやってみたいですね。[GAN](https://en.wikipedia.org/wiki/Generative_adversarial_network)など勉強すればまた新しい世界が開く気がしています。はまりそう。。。
おしまい。

# 参考
以下は参考にしたサイトだったり、調べる中で見つけた面白いツール達です。

* https://p5js.org/
* http://interactjs.io/
* http://paperjs.org/
* https://threejs.org/
* https://en.wikipedia.org/wiki/Generative_art
* https://www.youtube.com/watch?v=4Se0_w0ISYk
* https://qiita.com/mimonelu/items/c8147fd07b70d060a4bb
* https://www.michaelbromley.co.uk/experiments/chromata/
* https://deepart.io/
* https://deepdreamgenerator.com/