例えば、グラフを描画するとき、2、5、10といったキリの良い点で軸の目盛りや補助線の位置を決めたくなります。ここでは、最小値(xmin)と最大値(xmax)、および、キザミの個数の最小値(nmin)と最大値(nmax)を与えると、
for (i=imin; i<=imax; i=i+di) {
目盛りや補助線の作成
}
とすればよい imin, imax, di が得られる処理について説明します。
例えば次のように、imin, imax, di は末尾が0、2、5になっており、imin≦xmin, xmax≦imaxになります。
入 力 → 出 力
xmin xmax nmin nmax imin imax di (n)
ケース0 50101 50203 5 11 50100 50210 10 10
ケース1 0.011 0.031 5 11 0.010 0.032 0.002 10
以下は、xmin, xmax, nmin, nmaxを与えてimin, imax, diを求める関数 memori のソースコードです。解が配列で得られます。
function memori(xmin, xmax, nmin, nmax) {
var 戻り値 = [];
var xdef = xmax - xmin;
var 指数 = Math.floor(Math.log(xdef)/Math.LN10 -1);
var 除数 = Math.pow(10, 指数);
var 正規数 = Math.floor(xdef / 除数);
if ( (正規数 >= nmin) && (正規数 <= nmax) ) var n = 正規数;
else if ( (正規数/2 >= nmin) && (正規数/2 <= nmax) ) n = Math.round(正規数/2);
else if ( (正規数/5 >= nmin) && (正規数/5 <= nmax) ) n = Math.round(正規数/5);
else if ( (正規数/10>= nmin) && (正規数/10<= nmax) ) n = Math.round(正規数/10);
else if ( (正規数/20>= nmin) && (正規数/20<= nmax) ) n = Math.round(正規数/20);
else alert("適切なキザミ幅が見つかりませんでした。nmin, namaxの幅を広げてください");
if (xdef >= 1) var di = Math.round(xdef/n/除数)*除数;
else di = (xdef/n).toFixed(-指数);
戻り値[0] = Math.floor(xmin/di)*di;
戻り値[1] = Math.ceil(xmax/di)*di;
戻り値[2] = di;
return 戻り値;
}
呼出側
解 = memori(xmin, xmax, nmin, nmax);
// 解[0] にimin, 解[1] にimax, 解[2] にdi が戻される
上記のプログラムの実験です。