search
LoginSignup
13

More than 5 years have passed since last update.

Organization

渡された数値をある範囲から別の範囲に変換する方法について

タイトルが長くなってしまいましたが、やっている事としてはProcessingで言うmap関数の実装です。
こちらの関数ですが、他の環境だと実装されていない事もあったりするので、自前実装する際の参考用に計算式をメモ。
※C#で記載してます。

/// <summary>
/// 渡された数値をある範囲から別の範囲に変換
/// </summary>
/// <param name="value">変換する入力値</param>
/// <param name="start1">現在の範囲の下限</param>
/// <param name="stop1">現在の範囲の上限</param>
/// <param name="start2">変換する範囲の下限</param>
/// <param name="stop2">変換する範囲の上限</param>
/// <returns>変換後の値</returns>
float Map(float value, float start1, float stop1, float start2, float stop2)
{
    return start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
}

関数についてザックリと説明すると表題にもある通り、
渡した値(value)をある範囲(start1 ~ stop1の間)から別の範囲(start2 ~ stop2の間)の相対的な位置に変換します。

例を記載すると下記のようなイメージ。

float val, result;

// 変数valは範囲A(下記で言うと20~80の間)に収まる値が入る
val = 20f;
// 20~80の間の数値を100~200の間の数値に再マッピング
result = Map(val, 20f, 80f, 100f, 200f);
Console.WriteLine(result);                  // 100

val = 30f;
result = Map(val, 20f, 80f, 100f, 200f);
Console.WriteLine(result);                  // 116.6667

val = 50f;
result = Map(val, 20f, 80f, 100f, 200f);
Console.WriteLine(result);                  // 150

val = 80f;
result = Map(val, 20f, 80f, 100f, 200f);
Console.WriteLine(result);                  // 200

参考/関連リンク

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
13