Алгоритм для отображения интервала на меньший интервал
Я попытался выполнить поиск, но из-за характера моего вопроса я не смог найти что-то удовлетворительное.
Моя проблема заключается в следующем: я пытаюсь отобразить числа в диапазоне от 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);
}