剰余の計算を行います。 負の数を割ったときの剰余は多くの言語で未定義とされていますが、C++(%演算子やfmod関数)では負の数になります。また、C++の剰余演算子は整数型のみ定義されています。 Math::modは剰余の計算を浮動小数点型に拡張するとともに、負の数を割ったときの挙動を周期関数的にしてあります。視覚実験では周期関数の位相を値とすることが多くありますが、この関数を使うと位相が負でも正でも一定の範囲の剰余が得られます。ifやswitchで値ごとに条件分岐している場合には特に役立ちます。 たとえば、-450を360で割った剰余をとる場合、 {{{ -90 == -450 % 360 270 == Math::mod(-450, 360) }}} %演算子では剰余が負の数になってしまいますが、Math::modを使うと正の数で得ることができます。両関数をグラフで描画すると下図のようになります。 [img[image/Math.mod.png]] |!Psychlops::mod()|mod(double lhs, double rhs)|剰余を計算します。| |~|~|double lhs: 左辺項(割られる数)を指定します。| |~|~|double rhs: 右辺項(割る数)を指定します。| {{{ #include using namespace Psychlops; void psychlops_main() { Canvas display(Canvas::fullscreen); double upper_v = display.getVcenter()-100, lower_v = display.getVcenter()+100; while(!Input::get(Keyboard::esc)) { display.line(display.getHcenter()-100, upper_v, display.getHcenter()+100, upper_v, Color::white); display.line(display.getHcenter()-100, lower_v, display.getHcenter()+100, lower_v, Color::white); display.line(display.getHcenter(), upper_v+10, display.getHcenter(), upper_v-10, Color::white); display.line(display.getHcenter(), lower_v+10, display.getHcenter(), lower_v-10, Color::white); display.msg("C++ %", display.getHcenter()-100, upper_v -20, Color::white); display.msg("Math::mod", display.getHcenter()-100, lower_v -20, Color::white); for(int i=-100; i<100; i++) { display.pix(i+display.getHcenter(), upper_v - i%10, Color::red); display.pix(i+display.getHcenter(), lower_v - Math::mod(i, 10), Color::green); } display.flip(); } } }}}