見出し画像

ジェネレーティブ数式? Java で関数を動的に(無理やり)生成

プログラムに自分で数式を生成させ、その数式をもとにプログラムに絵を描かせるという試みです。

私のやっているクリエイティブ・コーディングでは「座標を計算して点を打つ」、これを何万回も何百万回も繰り返して図を生成しています。
この計算を行う数式によって結果として現れる図は全く違うものになります。

しかし、面白い図を描くためにいろんな数式を試してみるのもなかなかしんどい…

そんなときに、ryotako(@ryotakob)さんの描画の関数を実行時に動的に決定するというツイートを見て、座標計算の数式を動的にコンピュータに決定させたら楽だし面白いのでは?と思ったのがきっかけです。

この記事は全文無料でお読みいただけます。もしお気に召しましたら投げ銭お願いしますね。😉✨

画像1

数式生成の考え方

例えばこんな数式。

sin(x) + cos(y) * sqrt(y) - cos(x)

これを構成要素に分解すると下記 3つになります。

1. 数学的なメソッド sin(), cos(), sqrt()
2. そのメソッドのパラメータ x, y
3. 演算子 +, *, -

この 3要素ごとに配列を用意して、それぞれランダムに選択して組み合わせていけばよさそうですね。

メソッドは sin(置換文字列) として、置換文字列をパラメータの x や y に置き換えればいいですね。
pow() のように 2つパラメータを取るものは、簡単のために pow(置換文字列, 2) や pow(置換文字列, 3) といくつか用意すればよいでしょう。
演算子は +, -, *, % にしましょう。 / はゼロ除算が怖いので使いません。

画像2

JavaScript (p5.js) なら簡単!

JavaScript には Function コンストラクタがあるので、動的に関数を生成できます。

なので、 p5.js だとこのようなものが簡単に作れます。
コードと実際に動かせるページを用意しましたので、ぜひ遊んでみてください。

画像3

Java (Processing) でもできる?

Java を使う Processing ではどうしたらいいでしょう?

リフレクションとかちょっと調べてみましたが、どうも目的に合うものではないようです。なのでここはざっくりとハック(斧で大雑把にたたっ切る)します。
Processing のコードは単なるテキストファイルなんですから、そう考えるとなんでも出来ますよね。ということで力技でこのようにしてみます。

Java のコードで式を String として生成、それを標準出力に出力します。
 ↓
その標準出力をシェルスクリプトでテキストファイルに Java のクラスコードとしてリダイレクト。
 ↓
その Java クラスを数式として描画する Processing コードを動かす。

無理やりですが、動きます。「動く」は正義!


構成としてはこのようにしました。

run.sh
|- Draw/
|  |- Draw.pde
|  |- Formula.pde
|
|- Generate/
   |- Generate.pde

Generate.pde
数式を生成して標準出力に出力するプログラム

Formula.pde
生成された数式が Java クラスとして書き出されるファイル

Draw.pde
Formula.pde の数式を使って描画するプログラム

run.sh
各プログラムの起動や数式をリダイレクトを行うシェルスクリプト

全てのコードをこちらに置いてあります。

画像4

作品集

思ったよりもうまく動いて、なかなか面白い図が描かれます。

画像5

画像6

画像7

Draw.pde の描画部分を変えればまた違った面白い図が描けそうですね。
ぜひ、お試し下さい!

ここでこの記事はおしまいです。もしこの記事がお気に召しましたら投げ銭お願いします。😉✨

ここから先は

0字

¥ 100

この記事が面白かったらサポートしていただけませんか? ぜんざい好きな私に、ぜんざいをお腹いっぱい食べさせてほしい。あなたのことを想いながら食べるから、ぜんざいサポートお願いね 💕