我很难找到如何在具有定义的中间步骤数的两个数字之间线性插值。
比方说,我想通过8个中间步骤在4到22之间进行插值:Example
很容易发现这里是x + 2。但是,如果起始值为5,而最终值532具有12个中间步骤,该怎么办? (在我的特殊情况下,我需要使用介于16个步骤之间的开始和结束值)
答案 0 :(得分:3)
如果您有两个栅栏柱,并在它们之间放置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 :(得分:0)
要实际执行线性插值,请使用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; }
答案 2 :(得分:0)
我不愿给出两个单独的答案,但是我觉得这种方法与另一种方法完全不同。有一个有用的功能可能恰好是您所需要的,适当地称为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);
}