初めに
あるスケール(幅)のデータ(0~1等)を別のスケール(0~100等)に変更したいという場合が時々ある。
※生データは0~1だが、ページでの表示で0~画面の幅の値に変換したい等
こんな時、0~1→0~100とかなら0~1側の値を×100するだけでOKだし簡単
しかし、40~320→5~200にしたいとかになると、おバカなので頭がこんがらがってしまう。
ので変換式を考えてみようと思った。
結論
スケール $A:\{x|a<=x<=b,a \neq b\}$ の値$x$からスケール $B:\{y|c<=y<=d,c \neq d\}$ の値$y$への変換は
$y = (x-a) * \frac{(d-c)}{(b-a)} + c$
で表す事が出来る。
※以降$a \neq b$と$c \neq d$の記載は省略します。
導き方
まずは$A:\{x|a<=x<=b\}$からaを0にしたスケール、$A':\{x'|0<=x'<=b'\}$ に変換する事を考える。
すると、$b'=b-a$となり、$x'=x-a$で表す事が出来る。
つまり
$A:\{x|a<=x<=b\}$ → $A':\{x'|0<=x'<=b-a,x'=x-a\}$
同様に$B:\{y|c<=x<=d\}$からcを0にしたスケール、B'は
$B:\{y|c<=x<=d\}$ → $B':\{y'|0<=y'<=d-c,y'=y-c\}$
と出来る。
次にA'からB'への変換を考えると、
$y' = x' * \frac{(d-c)}{(b-a)}$
と出来るので、x'とy'をx,yに直すと
$y-c = (x-a) * \frac{(d-c)}{(b-a)}$
となる。
これをyについて解けば
$y = (x-a) * \frac{(d-c)}{(b-a)} + c$
と出来る。
実際に例に上げた
40~320→5~200を考えてみると
xが40の時
$(40-40) * \frac{(200-5)}{(320-40)} + 5 = 5$
xが320の時
$(320 - 40) * \frac{(200-5)}{(320-40)} + 5 = 200$
xが180(中央値)の時
$(180 - 40) * \frac{(200-5)}{(320-40)} + 5 = 102.5(5~200の中央値)$
となっている。