Rangeノードを使う(その2)

引き続きサンプルフローを見ていきます。Rangeノードシリーズ2回目にして最終回です。

入力値を制限する

最初のサンプルは「flows > node-red > function > range > 03 - Limit input value」です。入力値を指定した範囲内になるよう制限するようです。


動作」の設定は前回紹介したRangeノードのサンプル01と同じく「入力値の範囲外の値を最小値/最大値とし拡大/縮小」です。違うのは入力値の範囲と出力値の範囲のみ。


実行結果は、以下の通りです。
  • 入力0→出力0
  • 入力10→出力9
  • 入力100→出力90
入力値の範囲を出力値の範囲にマッピングして按分計算(上下限を超えた値はサチる)
ってことですね。これ以上の説明は不要かと思います。

入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小

次のサンプルは「flows > node-red > function > range > 04 - Scale and wrap input value」です。挙動の一部はよくわからない上に、利用する場面もイマイチよくわかりませんでした。プロパティを見ていくと、「動作」の設定が「入力値の範囲外の値を範囲幅で割った余りとし(「て」が抜けてる?)拡大/縮小」となっている以外、Rangeノードサンプル03と同じです。


実行すると、以下のような結果になります。
  • 入力0→出力0
  • 入力10→出力10
  • 入力100→出力10


入力値の範囲外の値を範囲幅で割った余りとし拡大/縮小」の表現をそのまま素直に読み解くと、
  • 入力値の範囲外の値:10
  • (出力値の?)範囲幅:90
  • 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:10÷90の余り:10
続いて、
  • 入力値の範囲外の値:100
  • (出力値の?)範囲幅:90
  • 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:100÷90の余り:10
計算通りになっているようです。ところで、「入力値の範囲内」の値を入力したらどうなるんでしょう。
  • 入力値:5
  • (出力値の?)範囲幅:90
  • 「入力値の範囲外の値」を「(出力値の?)範囲幅」で割った余りとし(て?)拡大/縮小:5÷90の余り:5
となるはずですが、実際に出力された値は「50」でした。画面上からは入力値の範囲内の値がどうなるか読み取れないので、どうにも判断ができませんでした。こういうときは「原文を当たれ」が鉄則なので英語表記に変更してみると「Scale and wrap within the target range」とありました。直訳すると「ターゲットレンジ内でスケールとラップ」となります。


続いて、Rangeノードのヘルプを見ると以下のように説明があります。入力値の範囲内の値を与えた場合の計算ルールは読み取れません。

Scale and wrap within the target range means that the result will be wrapped within the target range.

For example an input 0 - 10 mapped to 0 - 100.

mode input output
scale 12 120
limit 12 100
wrap 12 20

ということで、完全な理解は諦めました。詳しい人教えてください。

まとめ

今回の内容をまとめます。
  • 入力値の範囲外の値を最小値/最大値とし拡大/縮小」は挙動を完全に理解できなかった
中途半端な感じはしますが、Rangeノードシリーズはこれで終了です。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

Execノードを使う

Joinノードを使う(その4)