1

大家。我正在使用 Game Maker,这是一个语法有点类似于 Python(除了间距)的程序来实现多个数据值之间的插值,如此处所述。想象一个散点图,原点 x = 0,最后 x = 100,每个数据值之间的间距相等。x 位置是恒定的,但 y 位置可以具有任何值。如果在每个数据点之间连接线,那么理想情况下,脚本将能够找到给定 x 位置的 y。这是我最初的实现:

// This is executed once.

nums = 3; // the number of values to interpolate between
t = 0; // the position along the "scatterplot" of values

// Values may be decimals with any sign.  There should be values >= nums.
ind[0] = 100;
ind[1] = 0;
ind[2] = 100;

//This is executed each step.

intervals = 100 / (nums - 1);
index = round(percent / intervals);
if percent != 0 {newpercent=  (intervals / (percent - index)) / 100;}
else {newpercent = 0;}
newval = ind[index] * (1 - newpercent) + ind[index + 1] * newpercent;

在找到围绕给定 x 位置的哪两个点返回它们两个值之间的插值后,这应该使用 lerp(),但它没有,所以我的问题是:
出了什么问题,我该如何解决? 提前致谢。

编辑:这是完成和工作的代码:

// This is executed once.

nums = 3; // the number of values to interpolate between
t = 0; // the position along the "scatterplot" of values

// Values may be decimals with any sign.  There should be values >= nums.
ind[0] = 100;
ind[1] = 0;
ind[2] = 100;

// This is executed each step; setting the result to 'alpha'.

if (nums > 1) {
    if (t != 1) {
        _temp1 = 1 / (nums - 1);
        _temp2 = floor(t / _temp1);
        _temp3 = (t - (_temp1 * _temp2)) * (nums - 1);
        alpha = ind[_temp2] + _temp3 * (ind[_temp2 + 1] - ind[_temp2]);
    }
    else {
        alpha = ind[nums - 1];
    }
}
4

1 回答 1

0

您要做的是插入游戏属性的值(音量、危险级别、重力等)。让我们调用您想要计算的变量,y因为其他一些属性发生变化(如时间、x 位置等)让我们调用它t

我们有一些n点,我们知道 的值y。让我们将这些点p0中的每一个称为p1... pn-1,其中每个数字都是该index点的。让我们调用这些点中的值y0y1...。yn-1因此,对于任何给定的值,t我们都希望执行以下操作:

首先我们找到最接近 的两个点t。由于所有点都是均匀分布的,我们知道t给定点的值是t = index/(n-1)并且通过重新排序这个方程,我们可以得到任何给定 t 的“索引”,就像这样index = t*(n-1)。当t与我们的点之一不完全相同的位置时,它将是两个最近点的索引值和 之间的一个pk数字pk1。所以pk = floor(index)让你得到你之前的索引tpk1 = pk + 1是下一个点。

然后我们必须找出t这两个点的距离(值在 0 和 1 之间),因为这决定了每个点的值对插值的影响有多大。我们称之为测量alpha。然后alpha = (t - pk)/(pk1 - pk)

最后如果pkpk1有值ykyk1你得到你的插值y是这样的

y = (1-alpha)*yk + alpha*yk1;
于 2013-08-29T11:16:53.393 回答