27

処理には、私がいつも使用している優れた機能があります。

map(value, low1, high1, low2, high2)

http://processing.org/reference/map_.html

value(予想される範囲がlow1high1の)ターゲット範囲がlow2〜に再マップされますhigh2

他の言語で使用できるように、その背後にある数学を理解したいと思います。誰かが私に骨を投げて、それをリバースエンジニアリングするのを手伝いたいですか?私はそれが再スケーリングされて再オフセットされたlerpであることを理解しています...今朝脳死を感じています。

4

4 に答える 4

50

あなたの説明から、それはこれを行うべきですよね?

low2 + (value - low1) * (high2 - low2) / (high1 - low1)

最初の範囲までの距離を見つけ、範囲のサイズの比率でその距離をスケーリングします。これが、2番目の範囲までの距離です。

于 2010-08-10T17:16:25.953 に答える
8

処理はオープンソースです。ここmap()で関数を表示できます。

static public final float map(float value,
                                float start1, float stop1,
                                float start2, float stop2) {
    float outgoing =
      start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
    String badness = null;
    if (outgoing != outgoing) {
      badness = "NaN (not a number)";

    } else if (outgoing == Float.NEGATIVE_INFINITY ||
               outgoing == Float.POSITIVE_INFINITY) {
      badness = "infinity";
    }
    if (badness != null) {
      final String msg =
        String.format("map(%s, %s, %s, %s, %s) called, which returns %s",
                      nf(value), nf(start1), nf(stop1),
                      nf(start2), nf(stop2), badness);
      PGraphics.showWarning(msg);
    }
    return outgoing;
  }

具体的には、次のコード行を探しています。

float outgoing =
      start2 + (stop2 - start2) * ((value - start1) / (stop1 - start1));
于 2018-04-02T21:59:49.133 に答える
2

これは、low1とhigh1の間の係数を見つけて、係数をLERPのtとして使用する前に曲線で変調できるようにするために役立つ場合があることを付け加えたいと思います。

したがって、t =(value-low1)/(high1-low1)を使用して、low1からhigh1までの行の値の相対位置を取得します。

次に、ガンマ、バイアス、ゲインなどのカーブフィルターを使用してtを変調できます。また、設定された低値と高値を超える値を制限する場合は、tを0と1の間にクランプします。

次に、low2とhigh2の間のLERPにtを使用します。finalvalue= low2 *(1-t)+ high2 * t

于 2015-11-16T14:39:16.553 に答える
1

可能な限り精度を維持するフロートレスバージョンがあるかどうか疑問に思っている人は、私はこれを作成しました:

int remap(int value, int input_min, int input_max, int output_min, int output_max)
{
    const long long factor = 1000000000;

    long long output_spread = output_max - output_min;
    long long input_spread = input_max - input_min;

    long long l_value = value;

    long long zero_value = value - input_min;
    zero_value *= factor;
    long long percentage = zero_value / input_spread;

    long long zero_output = percentage * output_spread / factor;

    long long result = output_min + zero_output;

    return (int)result;
}

広範囲にテストされていないので、私にとってはうまくいくようです(たとえば、maxがminよりも小さい場合はテストされていません)。

背後にある考え方は、より大きな型を使用して元の値を拡大し、除算によってより大きな数値が生成されるようにすることです。これにより、精度が向上します。

于 2020-05-25T01:50:58.807 に答える