java Формула StdDraw для отношения [duplicate]

По умолчанию моя 64-разрядная версия Windows 10 включала только версию Powershell версии 1.0.

Убедитесь, что включен движок Windows Powershell 2.0.

Перезапустите VS2015 в режиме без администратора и отключите его. при этом все пакеты установлены правильно.

72
задан Scottie T 6 December 2008 в 00:37
поделиться

7 ответов

Разделите, чтобы получить соотношение между размерами двух диапазонов, затем вычтите начальное значение вашего внутреннего диапазона, умножьте на коэффициент и добавьте начальное значение вашего второго диапазона. Другими словами,

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

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

16
ответ дан Adi 20 August 2018 в 09:35
поделиться
  • 1
    Это не работает. Мой диапазон от 1000000000 до 9999999999, и цифры могут быть от 1 до 999999999. – Dejell 19 February 2013 в 11:39
  • 2
    @Odelya Конечно, это работает. Это достаточно простая математическая трансформация. Вам просто нужно использовать достаточно большой тип номера (bignum или аналогичный). Ваши номера просто слишком велики для 32-битных целых чисел, но, например, будут работать 64-битные целые числа. – Konrad Rudolph 19 February 2013 в 13:40
  • 3
    Они имеют тип double. двойной R = (20 - 10) / (6 - 2); double y = (X - 2) * R + 10; – Dejell 19 February 2013 в 13:43
  • 4
    @Odelya Тем не менее, проблема. Вы должны прочитать точность с плавающей точкой. На самом деле это необходимо прочитать: Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой - если вам нужен тип с плавающей запятой с такими большими числами, вам может понадобиться использовать точность число type . – Konrad Rudolph 19 February 2013 в 13:52
  • 5
    Можете ли вы порекомендовать тип java, который я могу сделать? – Dejell 20 February 2013 в 12:02

Каждый единичный интервал в первом диапазоне занимает (dc) / (ba) «пробел» во втором диапазоне.

Псевдо:

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

Как вы обрабатываете округление зависит от вас.

1
ответ дан Chris Cudmore 20 August 2018 в 09:35
поделиться

В дополнение к ответу @PeterAllenWebb, если вы хотите отменить результат, используйте следующее:

reverseX = (B-A)*(Y-C)/(D-C) + A
0
ответ дан Dejell 20 August 2018 в 09:35
поделиться

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

3
ответ дан Metro 20 August 2018 в 09:35
поделиться
  • 1
    Как это ответ? – shinzou 26 October 2017 в 16:38
  • 2
    Это пример применения вопроса. Многие из них имеют эту простую проблему во вводных классах CS и не считают, что решение может быть обобщено на другие проблемы. Я пытался добавить контекст к исходному вопросу. На первоначальный вопрос уже был дан адекватный ответ. – Metro 7 December 2017 в 21:21

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

Y = (XA) / (BA) * (DC) + C

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

154
ответ дан PeterAllenWebb 20 August 2018 в 09:35
поделиться
  • 1
    Благодарю. Именно то, что я искал. – Sam 5 December 2008 в 22:59
  • 2
    Тогда, возможно, отметьте этот ответ как «принятый», нажав на галочку рядом с ним. – Konrad Rudolph 6 December 2008 в 22:18
  • 3
    Спасибо, Питер, ты фантастический! – Adi 9 August 2012 в 14:36
  • 4
    Для ясности мне нравится new_value = (old_value - old_bottom) / (old_top - old_bottom) * (new_top - new_bottom) + new_bottom; – ftrotter 2 June 2014 в 05:25
  • 5
    Есть ли вывод для этого уравнения где-нибудь? – shaveenk 28 October 2016 в 21:39
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 20 August 2018 в 09:35
поделиться

Было бы неплохо иметь эту функциональность в классе java.lang.Math, так как это такая широко требуемая функция и доступна на других языках. Вот простая реализация:

final static double EPSILON = 1e-12;

public static double map(double valueCoord1,
        double startCoord1, double endCoord1,
        double startCoord2, double endCoord2) {

    if (Math.abs(endCoord1 - startCoord1) < EPSILON) {
        throw new ArithmeticException("/ 0");
    }

    double offset = startCoord2;
    double ratio = (endCoord2 - startCoord2) / (endCoord1 - startCoord1);
    return ratio * (valueCoord1 - startCoord1) + offset;
}

Я помещаю этот код здесь как ссылку на будущее и, возможно, это кому-то поможет.

5
ответ дан Sourabh Bhat 20 August 2018 в 09:35
поделиться
Другие вопросы по тегам:

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