Алгоритм для отображения интервала на меньший интервал

Я попытался выполнить поиск, но из-за характера моего вопроса я не смог найти что-то удовлетворительное.

Моя проблема заключается в следующем: я пытаюсь отобразить числа в диапазоне от 0 до 2000 (хотя в идеале верхний предел будет настраиваться) до гораздо меньшего интервала в диапазоне от 10 до 100. Верхние пределы будут отображаться (2000- > 100) и нижние пределы. Кроме того, запись, которая больше, чем другая запись в интервале [0; 2000], в идеале будет больше, чем эта отображаемая запись в [0; 100]

Я думаю, что этот вопрос не зависит от языка, но на случай, если вам интересно, я сегодня работаю с Javascript.

Ответ 1

To map
[A, B] --> [a, b]

use this formula
(val - A)*(b-a)/(B-A) + a

как правильно указано в другом ответе, это линейное отображение.

В принципе

y = m*x + c

c = intersection at y-axis
m = slope determined by two known point (A, a), (B, b) = (b-a)/(B-A)

Ответ 2

Простым линейным отображением будет отображение x в x*90/2000+10.

Ответ 3

// Given a value from intervalA, returns a mapped value from intervalB.
function intervalicValueMap(intervalA, intervalB, valueIntervalA) {
    var valueIntervalB = (valueIntervalA - intervalA[0]) * (intervalB[1] - intervalB[0]) 
                            / (intervalA[1] - intervalA[0]) + intervalB[0];

    valueIntervalB = Math.round(valueIntervalB); // Ommit rounding if not needed.
    return valueIntervalB;
}

var intervalA = [100, 200];
var intervalB = [1, 10];
var valueIntervalA = 170;
var valueIntervalB = intervalicValueMap(intervalA, intervalB, valueIntervalA);

console.log(valueIntervalB); // Logs 7

Ответ 4

Я думаю, что вместо того, чтобы давать вам формулу прямого сопоставления, лучшим подходом было бы объяснить ее идею:

Предположим, что мы хотим отобразить отрезок [0,1] на отрезок [1,3], который можно рассматривать как задачу нахождения f (x) = Ax + B, такую, что задавая любой x из интервала [0, 1], приведет к тому, что f (x) будет/в результате интервала [1,3].

С этой точки зрения мы уже знаем некоторые значения:

  • x = 0 и f (0) = 1 = > f (0) = A * 0 + B = 1 = > B = 1
  • x = 1 и f (1) = 3 = > f (1) = A * 1 + B = 3 <= > A + 1 = 3 = > A = 2

Из (1) и (2) можно заключить, что функция, переводящая интервал [0,1] в [1,3], равна f (x) = 2x + 1.

В вашем случае вы должны иметь все необходимые знания, чтобы иметь возможность сопоставить интервал [0,2000] с [10,100].

Ответ 5

Здесь может быть оптимизированный способ сопоставления ваших данных x, Этот псевдо-код показывает вам основную идею для функции отображения что:

  • Избегайте проблем с значениями x из диапазона b1 - b2.
  • Сделки с отображением массива

    function map(var x, var b1, var b2, var s1, var s2)
    {
        var i;
        var result;
    
        i = 0;
        while(i < sizeof(s2))
            if(x < b1)
                result[i++] = s1;
            else if (x > b2)
                result[i++] = s2;
            else
                result[i] = (x - b1) / (b2 - b1 ) * (s2[i] - s1[i]) + s1[i++];
        return (result);
    }