#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. Это зависит от того, считаете ли вы свое начальное значение шагом или рассматриваете шаги как переход от одного значения к другому.