任意の範囲の数値を特定の範囲に変換したいときのテクニックのはなし

 タイトルではいまいち実感が沸かないかもしれません。そこでイメージを持ってもらうために簡単に例を出します。例えば、乱数で生成した0から1.0の数値を120から200までの座標として利用したい場合。センサからの入力が200から250でこれを-100から100の出力に対応させて利用したい場合。プログラムで何かを連動させて操作したくなることは度々あります。if文(Scratchで言う「もし」)を使ってその都度条件分けすることもできなくはないですがこれは融通がきかずナンセンスです。今回はこういう場合に便利なテクニックをご紹介します。

結論

 結論から言ってしまうと以下の一般式で変換が可能です。利用条件は変換元、変換先どちらも範囲が連続していること。

解説

 結論だけではさっぱりな方やそもそも文字式に慣れていない方も多いかもしれません。そこで具体的な数を使って解説していきたいと思います。ここでは先程出した「200~250→-100~100」の変換を例にとって考えていきます。

大きさと位置

 「200~250」と「-100~100」の範囲の違いは何でしょうか。それは範囲の大きさと範囲の最初の数値です。範囲の大きさはただの差ですから下記のように引き算すれば求めることができます。

 それでは50は何倍すれば200にできるでしょうか。単純に割り算すればわかりそうですね。

 つまり範囲の大きさは4倍すれば変換できそうなことがわかりました。続いて範囲の位置の違いです。それぞれ最初の数値は200と-100なのでこの違いは単純に引き算するだけで求めることができます。

 つまり範囲の位置は-300を足すことで揃えることができそうです。この2つの違いを明確にすることができればもう変換式を作ることができます。

式にする

 センサから取った数値は4倍して300引くだけでもう変換できます。式にしてみると以下のようになります。

 これを更に他の式をつくるときにも使えるように言葉にすると以下のようになります。

まとめ

いかがでしょう。最初に書いた結論よりもぐっとイメージが持てるようになっていれば幸いです。今回紹介したテクニックはとても使い所が多く、プログラミングの幅が効くようになります。少し難しい内容ですが実際に自分でたくさん作ってみてぜひマスターしてみてください。