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

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

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

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

 Chowlett17 окт. 2012 г., 11:28
Являются ли ваши диапазоны целочисленными или действительными / плавающими / десятичными? Требуются ли разные записи в источнике для сопоставления с разными записями в пункте назначения?
 Zaan17 окт. 2012 г., 11:56
Сразу после ввода этого вопроса я нашел (для меня) приемлемое решение: я вычислил процентное значение для первой записи в интервале, а затем перенес этот процент в новый интервал.

Ответы на вопрос(5)

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)
 Zaan17 окт. 2012 г., 11:58
Я закончил тем, что делал что-то похожее. Описание выше, но скрипт здесь: (nMinValue - это B, nMaxFontSize - это a)var nPercentage = ((modifier-nMinValue)/(nMaxValue - nMinValue))*100; var nFontSize = parseInt((nBiggestFont-nSmallestFont)*(nPercentage/100)+nSmallestFont);
 Nishant17 окт. 2012 г., 12:01
да, выглядит хорошо.

т псевдокод показывает основную идею функции карты, которая:

Избегайте проблем со значениями 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);
}
// 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

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

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

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

х = 0 & f (0) = 1 => f (0) = A * 0 + B = 1 => B = 1х = 1 & f (1) = 3 => f (1) = A * 1 + B = 3 <=> A + 1 = 3 => А = 2

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

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

x кx*90/2000+10

Ваш ответ на вопрос