Линейная интерполяция между двумя числами с шагами - PullRequest
3 голосов
/ 09 апреля 2019

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Если у вас есть два столбика забора и вы поместили между ними 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 голос
/ 09 апреля 2019

Я не решаюсь дать два отдельных ответа, но я чувствую, что эта методология достаточно уникальна по сравнению с другой. Есть полезная функция, которая может быть именно тем, что вам нужно, которая соответственно называется 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);
}
1 голос
/ 09 апреля 2019

Для фактического выполнения линейной интерполяции используйте 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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...