44840


たとえば０から１０の間で値を受け取って、それを-1から１の数値に変換してくれるような関数を探しています。

リマップという表現が正しいのかわからないですが、ShaderForgeで言う所のRemapのような関数をしりたいです。そもそもあるんでしょうか？

単純な質問で恐縮なんですが、自分で調べても出てこないので質問します。


CC BY-SA 4.0
2018-06-17T09:07:28.323
44822
2018-06-18T04:41:33.470
26678
question
unity3d
値をリマップできる関数を知りたい


Unityフォーラムに類似質問の[回答](https://forum.unity.com/threads/re-map-a-number-from-one-
range-to-another.119437/#post-800377)がありました。

標準ではRemap関数が用意されていないようですので、自作する必要があります。  
[拡張メソッド](http://albatrus.com/main/unity/7350)を使うならば、下記の`Remap`のようなメソッドを使用します。

ただし下記のコードでは範囲外の値を渡された時にも計算済みの値を返します。  
ShaderForgeのRemapのように範囲外の場合は計算せずに渡された値を返すならば、コードの修正を行ってください。

[code]

    using System;
    
    namespace ConsoleApplication1
    {
        public static class ExtensionMethods
        {
            public static float Remap(this float value, float from1 = 0, float to1 = 10, float from2 = -0.1f, float to2 = 0.1f)
            {
                return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
            }
    
        }
    
        //簡単のためUnityではなくコンソールアプリ版のサンプルコード
        class Program
        {
            static void Main(string[] args)
            {
                for (var i = 0; i <= 10; i++)
                {
                    var f = (float)i;
                    var r = f.Remap(0f, 10f, -0.1f, 0.1f);
                    Console.WriteLine("{0}, {1}", r, f.Remap()); //引数未省略と省略で同一の結果となる
                }
                Console.WriteLine(100f.Remap());                 //エラーとならずに1.9を返す
                Console.Read();
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2018-06-18T04:41:33.470
44840
2018-06-18T04:41:33.470
9820
44822
answer