oF_Enumの値をランダムで取得する

oFのtipsメモです。

※こちらの記事ですが、誤解を招いてしまうことがありました。すいません!
追記でコメント補足しておきます。(201906)

openFrameworksでEnumを使っていろいろする際に、値をランダムで取得したいと思いました。
具体的には、いろんな図形のパーティクル的なものを作る際に、enum(列挙型変数)で TRIANGLE,RECTANGLE, CIRCLE などを選択できるようにしたKatachiクラスを作っておいて、コンストラクタの中で形をランダムで決定するというものです。

「Enum ランダム」のように調べるとあまり日本語で文献がなかったように思ったので、メモしておきます。
参考にしたのは以下
https://stackoverflow.com/questions/2999012/generating-random-enums

結論から書くと、
katachiMode = static_cast<Mode>(round(ofRandom(3)));
という感じ。
static_castenumで設定したModeという型にキャストするということです。
ただし、いつでもこれで解決できるというわけではなさそうで、
contiguous連続的?)な場合でしか使えないとのこと。
おそらく、enumの値を
enum Mode{
Triangle = 0,Circle = 3, ~~
みたいにするとダメよってことだと思っています。深く追求してません。

もし間違っていたら教えていただければ幸いです。。

→間違ってはいないですが特に上のことをする必要もありませんでした。🙏
enumで指定した型(ここではKatachi_Mode)を持つ変数へ値を代入するには、

katachiMode = (KATACHI_MODE)(int)ofRandom(3);

とシンプルにキャストするだけでよかったみたいです。
たしかWindowsでは一度(int)にキャストした上で、再度(KATACHI_MODE)にキャストする必要があったはず。逆にOSXでは直接(KATACHI_MODE)にキャスト可能。
さらに、ここではofRandom(3)としていますが、本当はenumで指定している要素の数を指定したいところ。

ただ如何せんenumには要素数を取得するメソッドはないみたいで、上のstackoverflowのリンクでもあるように、要素の最後にlast,など追加して、このlastを全体の要素数として利用する方法などが調べるとよく出てきます。

このやり方がどうにも腑に落ちないので、vector<string>で要素名のリストを作って、この要素名のサイズを利用することが多いです。
こうしておけば、enumの名前をstringとして取得できるし、enumを増やした際に割と流れで名前を追加できるので漏れが少ない気がします。

正直まだ腑に落ちていないけれど、一旦はこれで落ち着いてます。が、もっといい方法ないでしょうか・・

・・・

で、これを使って以下のようなクラスを作りました。(一部省略)
(gistも修正しました🙇‍♂️)

vector<Katachi> katachiV; をつくって
katachiV.push_back(k);

などでKatachiインスタンスを追加するたびにランダムで四角や三角のオブジェクトを追加することができます。

ミニマムなテストですが、いつか来るであろうVJイベント参加に向けてoFでいろいろできるようにちまちまと作っていきたいと思います。
(以前、interimというIAMASと多摩美のイベントでoFを使ったVJを拝見して感化されていました。)

超余談ですが、クラス名をKatachiのように日本語で作るのいいなと思ってます。
oF開発者ザック・リーバーマンさんが、School for Poetic Computation(SFPC)というのされていて、詩的なコーディングを目指すって思想がありまして、コードの中でもちょっとオサレ意識もつこと大事だなと思います。
まだまだ勉強中ですが、そういうことを今のうちから意識してもいいよなと。

コメントを残す

メールアドレスが公開されることはありません。