パッと分からないスケールの変換を考える


初めに

あるスケール(幅)のデータ(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の中央値)$

となっている。