带步长的两个数字之间的线性插值

时间:2019-04-09 19:53:30

标签: c# unity3d math

我很难找到如何在具有定义的中间步骤数的两个数字之间线性插值。

比方说,我想通过8个中间步骤在4到22之间进行插值:Example

很容易发现这里是x + 2。但是,如果起始值为5,而最终值532具有12个中间步骤,该怎么办? (在我的特殊情况下,我需要使用介于16个步骤之间的开始和结束值)

3 个答案:

答案 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;

请注意,这方便地假定您的distancesteps的整数倍。如果您不知道这种情况,并且不要超过该步骤数很重要,则可能需要显式检查。这是整数的粗略示例。浮点方法可能更复杂:

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);
}