Математика - отображающиеся числа

Как я отображаю числа, линейно, между a и b для движения между c и d.

Таким образом, я хочу, чтобы числа между 2 и 6 отобразились на числа между 10 и 20..., но мне нужен обобщенный случай.

Мой мозг пожарен.

90
задан Luuklag 19 July 2019 в 07:30
поделиться

5 ответов

Если бы Ваш номер X падает между A и B, и Вы хотели бы, чтобы Y упал между C и D, можно применить следующее линейное преобразование:

Y = (X-A) / (B-A) * (D-C) + C

, Который должен дать Вам, что Вы хотите, хотя Ваш вопрос немного неоднозначен, так как Вы могли также отобразить интервал в обратном направлении. Просто не упустите деление на нуль, и необходимо быть в порядке.

191
ответ дан Markus Dresch 24 November 2019 в 06:59
поделиться

Разделитесь, чтобы получить отношение между размерами двух диапазонов, затем вычесть начальное значение Вашего диапазона inital, умножиться отношением и добавить начальное значение Вашего второго диапазона. Другими словами,

R = (20 - 10) / (6 - 2)
y = (x - 2) * R + 10

Это равномерно распространяет числа от первого диапазона во втором диапазоне.

20
ответ дан Adi 24 November 2019 в 06:59
поделиться

Как в стороне, это - та же проблема как классическое преобразование Цельсия в farenheit, где Вы хотите отобразить диапазон числа, который приравнивается 0 - 100 (C) к 32 - 212 (F).

3
ответ дан Metro 24 November 2019 в 06:59
поделиться

Каждый единичный интервал на первом диапазоне поднимает (d-c) / (b-a) "пространство" на втором диапазоне.

Псевдо:

var interval = (d-c)/(b-a)
for n = 0 to (b - a)
    print c + n*interval

то, Как Вы обрабатываете округление, ваше дело.

1
ответ дан Chris Cudmore 24 November 2019 в 06:59
поделиться
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);

С начинает работу, делятся на нуль, конечно.

1
ответ дан PhiLho 24 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: