OpenSiv3DでPolygonクラスを使ってみる。

OpenSiv3Dでは、Polygonクラスで簡単に多角形が作れます。以下のように初期化時に頂点を指定してdrawメソッドで描画したり、

または、頂点配列を別途用意して、Polygon(頂点配列).draw();という書き方もあります。またdrawFrameメソッドを使うと塗りつぶさずフレームのみを表示できます。

ユーザー定義リテラル(user defined literals)

C++11では、「ユーザー定義リテラル(user defined literals)」機能により、数字や文字列などのリテラルにサフィックスを付けられます。

OpenSiv3Dでは、MathConstants.hppで_pi、_degユーザー定義リテラルを実装していて、double a = 2.0_pi;のような記述ができます。

実装してみる

実装方法は演算子のオーバーロードと同じです。コード量も少ないので、https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html などを参考に実装できます。

 

 

 

C++11/14のalgorithmとfunctionalで、階乗やフィボナッチ数列を作る

C++11/14では、algorithmヘッダーで関数型APIが用意され、functionalヘッダーでラムダ記法も可能です。今日は他の言語ではmap関数として用意されているtransform関数を使ったり、階乗やフィボナッチ数列を作ってみました。

ラムダ式内で再帰的に関数を使う場合は、型推論のautoで作るとうまくいかないようです。function<int(int)> fのように明示すれば問題なく実行できます。またキャプチャーも参照[&]にする必要があります。

 

VisualStudio2017でBoost1.64.0を使う方法

Boost1.64.0は、シグナルというイベント通知やObserverパターンと同様な機能があるので、VisualStudio2017で使ってみました。

Boostの基本的な機能はヘッダーに実装が書かれているため、ヘッダーを読み込むだけで使えますが、シグナルは、Boostをビルドする必要がありました。ですがVisualStudio2017の開発者プロンプトで問題なくビルドできました。

Boostのビルド

bootstrap.batの実行

「Developer Command Prompt for VS 2017」を検索し、コンソール版のコンパイル環境を起動します。BoostをZIP展開したディレクトリーに移動して、bootstrap.batを実行します。これでビルドするためのb2.exeが作成されます。

b2.exeを実行してビルドする

ビルドが成功すると、stage\lib配下に、libファイルが作成されます。また、以下のようにインクルードバスとライブラリーパスの設定方法が表示されるので、VisualStudio2017で設定します。

 

サンプルソースコード

boostjp.github.ioを例にシグナルを使うサンプルを実行してみました。

 

これで自分でObserverパターンを書かずに、実績のある通知機能を使えるようになりました。

 

 

p5.jsでライフゲーム

p5.jsでライフゲームを作成しました。

剰余による回り込み

二次元配列のboard[0][0]の場合は、近傍(neighbor)を調べるときに、board[-1][-1]のようになりエラーになってしまいます。このような場合は、(カラム数+現在のカラム-1%カラム数) のように書くと、カラム数が20だったらboard[19]となってくれます。一次元配列でもこの剰余のテクニックを使うと、配列をリングに見立てることができるので、非常に便利です。

ライフゲーム自体の実装は、着実に進めていけば簡単です。

 

p5.jsで一次元セルオートマトン

p5.jsで一次元セルオートマトンを作ってみました。ルール関数を作成し、0-255でルールを生成できるようにしました。ルール生成関数は、ビット演算とシフト演算んでもっと綺麗な実装にできそうです。

剰余による回り込みの実装

また、(配列の長さ+現在のインデックス)%配列の長さ というテクニックを使い、配列の0番目で、左端の値の場合は、配列の最後である右端の値を取得するようにしました。