Линейная интерполяция между двумя числами с шагом

#c# #unity3d #math

#c# #unity3d #математика

Вопрос:

У меня небольшая проблема с поиском способа линейной интерполяции между двумя числами с определенным количеством промежуточных шагов.

Допустим, я хочу выполнить интерполяцию между 4 и 22 с 8 промежуточными шагами, например: Пример

Легко понять, что здесь x 2. Но что, если начальное значение было 5, а конечное значение 532 с 12 промежуточными шагами? (В моем особом случае мне понадобилось бы начальное и конечное значение с промежуточными шагами 16)

Комментарии:

1. Как вы получили x 2 ? Можете ли вы решить свой второй пример вручную?

2. Это дало бы что-то уродливое @Code-Apprentice, но : 45.53846154 86.07692308 126.6153846 167.1538462 207.6923077 248.2307692 288.7692308 329.3076923 369.8461538 410.3846154 450.9230769 491.4615385

3. @Pouissante Чего ты хочешь в stead?

Ответ №1:

Если у вас есть два столба забора, и вы помещаете k столбов забора между ними, вы создаете k 1 пробелов. Например:

 |           |
post1       post2


      adding one posts creates two spaces
|     |     |
post1       post2
  

Если вы хотите, чтобы эти пробелы k 1 были равными, вы можете разделить общее расстояние на k 1, чтобы получить расстояние между соседними столбцами.

 d = 22 - 4 = 18
k = 8
e = d / (k   1) = 18 / 9 = 2
  

В вашем другом примере ответ таков

 d = 532 - 5 = 527
k = 12
e = d / (k   1) = 527 / 13 ~ 40.5
  

Комментарии:

1. Ммм, оглядываясь назад, мне трудно понять, почему в нем 9 шагов, поскольку у меня есть 8 чисел для «обнаружения». Если я возьму пример с вашими сообщениями, я могу только понять, что я разместил 7 сообщений между началом и концом, поэтому k 1 будет равно 8?

2. @Pouissante Ваши «шаги» на самом деле являются сообщениями в моем примере. Если вы думаете о «шагах» как о промежутке между сообщениями, ваш новый способ мышления пренебрегает шагом от последнего промежуточного сообщения до самого правого сообщения. Если есть первый шаг, последний шаг и N промежуточных шагов, чтобы перейти от первого к последнему (начиная с первого), вам нужно выполнить (N 2) — 1 шаг; 2, потому что N промежуточных шагов 1 начальный шаг 1 заключительный шаг; -1поскольку предполагается, что вы уже находитесь на начальном шаге, поэтому вам не нужно делать шаг, чтобы коснуться его.

Ответ №2:

Я не решаюсь дать два отдельных ответа, но я чувствую, что эта методология достаточно уникальна по сравнению с другой. Есть полезная функция, которая может быть именно тем, что вам нужно, которая вызывается соответствующим Mathf.Lerp() образом.

 var start = 5;
var end = 532;
var steps = 13;
for (int i = 0; i <= steps; i  ) {
    // The type conversion is necessary because both i and steps are integers
    var value = Mathf.Lerp(start, end, i / (float)steps);
    Debug.Log(value);
}
  

Ответ №3:

Для фактического выполнения линейной интерполяции используйте Mathf.MoveTowards() .

Для определения вашей максимальной дельты (т. Е. Суммы, Которую вы хотите, чтобы она перемещала каждый шаг), возьмите разницу, а затем разделите ее на количество желаемых шагов.

 var start = 4;
var end = 22;
var distance = end - start;
var steps = 9; // Your example technically has 9 steps, not 8
var delta = distance / steps;
  

Обратите внимание, что это удобно предполагает, что ваше distance значение является чистым кратным steps . Если вы не знаете, что это так, и важно, чтобы вы никогда не превышали это количество шагов, вы можете захотеть явно проверить это. Вот грубый пример для целого числа. Методы с плавающей запятой могут быть более сложными:

 if (distance % delta > 0) { delta  = 1; }
  

Комментарии:

1. Спасибо за пример. Если шаг не является целым числом, я приведу его, мне не нужны плавающие точки.

2. Я на самом деле намерен опубликовать второй ответ, потому что это совсем другая методология, которая может лучше соответствовать вашим потребностям.

3. Ммм, оглядываясь назад, мне трудно понять, почему в нем 9 шагов, поскольку у меня есть 8 чисел для «обнаружения».

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