Numberの整数化タイミングについて考える
JavaScript囲碁ライブラリを修正した。
左が修正前、右が修正後

線の間隔を等間隔にしていたが、Canvasサイズによっては余白が大きくなる。
そのため、線の間隔を算出する部分を修正した。
<修正前>
線の間隔を求めた際に整数化
<修正後>
線の座標をセットする際に整数化
負荷を減らすため、Canvasに設定する座標やサイズを整数にしている。
整数化するタイミングや方法がバラバラなので整理することにした。
・整数が期待される引数
ローカル変数にセットする際に~~で整数化。
・算出頻度が低く、他の計算に使用されない値
セットする際にMath.round()で整数化。切り捨てが必要な場合のみ~~で整数化。
・算出頻度が高く、他の計算に使用されない値
セットする際に~~で整数化。
・間隔の長さなど、他の計算に使用される値
整数化しない。
クラスのプロパティなどに値を保持する場合は、コメントに整数でない旨明記。
ループで加算する際など、他の計算に使用されることを見過ごして誤差を積み上げてしまうことがあるので注意。
とりあえずこんな感じでやってみるか。
<関連エントリ>
[JavaScript]小数を整数に変換する望ましい方法は?
左が修正前、右が修正後


そのため、線の間隔を算出する部分を修正した。
<修正前>
線の間隔を求めた際に整数化
<修正後>
線の座標をセットする際に整数化
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);
}
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;
* 何路盤かセット
* @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)];
this.centpos = [Math.round(this.cvwidth_ / 2), Math.round(this.cvheight_ / 2)];
・算出頻度が高く、他の計算に使用されない値
セットする際に~~で整数化。
・間隔の長さなど、他の計算に使用される値
整数化しない。
クラスのプロパティなどに値を保持する場合は、コメントに整数でない旨明記。
/**
* 碁盤の目の間隔(px)。not integer
* @type {number}
* @private
*/
this.eyesep_ = 0;
* 碁盤の目の間隔(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);
}
// this.xArr_[i - 1]は整数化されているため、丸め誤差が含まれる
this.xArr_[i] = Math.round(this.xArr_[i - 1] + sep);
}
とりあえずこんな感じでやってみるか。
<関連エントリ>
[JavaScript]小数を整数に変換する望ましい方法は?
スポンサーサイト