目盛り<Javascript<木暮仁

目盛り


機能の説明

例えば、グラフを描画するとき、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 が戻される 

実験

上記のプログラムの実験です。

入力:xmin= xmax= xmin= xmax=
出力:imin= imax= di=