fc2ブログ

Numberの整数化タイミングについて考える

JavaScript囲碁ライブラリを修正した。
左が修正前、右が修正後
囲碁ライブラリ修正前
囲碁ライブラリ修正後
線の間隔を等間隔にしていたが、Canvasサイズによっては余白が大きくなる。
そのため、線の間隔を算出する部分を修正した。

<修正前>
線の間隔を求めた際に整数化

<修正後>
線の座標をセットする際に整数化
  var sepx = (this.cvwidth_ - coormarg) / (rownum - 1 + this.banmarg_); // 線の間隔
  this.xArr_ = []; // x座標格納配列
  this.xArr_[0] = banmarg + coormarg;
  for (var i = 1; i < rownum; i++) {
    this.xArr_[i] = Math.round(this.xArr_[0] + sep * i);
  }


負荷を減らすため、Canvasに設定する座標やサイズを整数にしている。
整数化するタイミングや方法がバラバラなので整理することにした。

・整数が期待される引数
ローカル変数にセットする際に~~で整数化。
/**
 * 何路盤かセット
 * @param {number} inrownum 何路盤か。5以上19以下の整数を設定
 */
migolib.Goban.prototype.setrownum = function(inrownum) {
  var rownum = ~~inrownum;

・算出頻度が低く、他の計算に使用されない値
セットする際にMath.round()で整数化。切り捨てが必要な場合のみ~~で整数化。
  /* canvas中心座標 */
  this.centpos = [Math.round(this.cvwidth_ / 2), Math.round(this.cvheight_ / 2)];

・算出頻度が高く、他の計算に使用されない値
セットする際に~~で整数化。

・間隔の長さなど、他の計算に使用される値
整数化しない。
クラスのプロパティなどに値を保持する場合は、コメントに整数でない旨明記。
  /**
   * 碁盤の目の間隔(px)。not integer
   * @type {number}
   * @private
   */
  this.eyesep_ = 0;

ループで加算する際など、他の計算に使用されることを見過ごして誤差を積み上げてしまうことがあるので注意。
  for (var i = 1; i < rownum; i++) {
    // this.xArr_[i - 1]は整数化されているため、丸め誤差が含まれる
    this.xArr_[i] = Math.round(this.xArr_[i - 1] + sep);
  }

とりあえずこんな感じでやってみるか。

<関連エントリ>
[JavaScript]小数を整数に変換する望ましい方法は?
スポンサーサイト



コメント

コメントの投稿

非公開コメント

プロフィール

himax64

Author: 南西
30代後半の無職です。
就活もせずダラダラ生きてます。
作ったもの

最新記事
人気記事
検索フォーム
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QRコード
カウンター