Переопределение значений - PullRequest
       6

Переопределение значений

17 голосов
/ 10 августа 2010

Обработка имеет отличную функцию, которую я использую все время:

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

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

Она переопределяет value (ожидаемый диапазон от low1 до high1) в целевой диапазон от low2 до high2).

Я хочу понять математику, стоящую за ним, чтобы использовать ее на других языках.Кто-нибудь хочет бросить мне кость и помочь мне реконструировать его?Я понимаю, что это измененный масштаб, который был изменен ... чувствую себя мертвым сегодня утром.

Ответы [ 3 ]

29 голосов
/ 10 августа 2010

Из вашего описания, это должно быть сделано, верно?

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

Найдите, как далеко вы находитесь в первом диапазоне, масштабируйте это расстояние на основе соотношения размеров диапазонов, и вот как далеко вы должны быть во втором диапазоне.

3 голосов
/ 03 апреля 2018

Обработка с открытым исходным кодом.Вы можете просмотреть 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));
1 голос
/ 16 ноября 2015

Я хотел бы добавить, что иногда полезно найти коэффициент между low1 и high1, так что вы можете модулировать его с помощью кривой, прежде чем использовать коэффициент в качестве LERP's t.

Итак, t = (value-low1) / (high1-low1), чтобы получить относительное положение значения в строке от low1 до high1.

Затем вы можете модулировать t с помощью некоторого фильтра кривой, например, гаммы, смещения, усиления и т. д. Кактакже ограничьте t между 0 и 1, если вы хотите ограничить значения, выходящие за установленные минимумы и максимумы.

А затем используйте t для LERP между low2 и high2, например: finalvalue = low2 * (1-t) + high2 * t

...