Если бы Ваш номер X падает между A и B, и Вы хотели бы, чтобы Y упал между C и D, можно применить следующее линейное преобразование:
Y = (X-A) / (B-A) * (D-C) + C
, Который должен дать Вам, что Вы хотите, хотя Ваш вопрос немного неоднозначен, так как Вы могли также отобразить интервал в обратном направлении. Просто не упустите деление на нуль, и необходимо быть в порядке.
Разделитесь, чтобы получить отношение между размерами двух диапазонов, затем вычесть начальное значение Вашего диапазона inital, умножиться отношением и добавить начальное значение Вашего второго диапазона. Другими словами,
R = (20 - 10) / (6 - 2)
y = (x - 2) * R + 10
Это равномерно распространяет числа от первого диапазона во втором диапазоне.
Как в стороне, это - та же проблема как классическое преобразование Цельсия в farenheit, где Вы хотите отобразить диапазон числа, который приравнивается 0 - 100 (C) к 32 - 212 (F).
Каждый единичный интервал на первом диапазоне поднимает (d-c) / (b-a) "пространство" на втором диапазоне.
Псевдо:
var interval = (d-c)/(b-a)
for n = 0 to (b - a)
print c + n*interval
то, Как Вы обрабатываете округление, ваше дело.
int srcMin = 2, srcMax = 6;
int tgtMin = 10, tgtMax = 20;
int nb = srcMax - srcMin;
int range = tgtMax - tgtMin;
float rate = (float) range / (float) nb;
println(srcMin + " > " + tgtMin);
float stepF = tgtMin;
for (int i = 1; i < nb; i++)
{
stepF += rate;
println((srcMin + i) + " > " + (int) (stepF + 0.5) + " (" + stepF + ")");
}
println(srcMax + " > " + tgtMax);
С начинает работу, делятся на нуль, конечно.