0

我正在尝试在 Android 上构建的 Java 应用程序中调整 alpha 值。现在它是这样的:

if (goingUp) {
    newAlpha = oldAlpha + rateOfChange;
    if (newAlpha > maxAlpha) {
        newAlpha = maxAlpha;
        goingUp = false;
    }
} else {
    newAlpha = oldAlpha - rateOfChange;
    if (newAlpha < minAlpha) {
        newAlpha = minAlpha;
        goingUp = true;
    }
}

其中rateOfChange是一个不能大于 maxAlpha 的任意 int。该等式评估线程中的每个刻度,并且与时间无关。

有没有办法只使用给定的变量 + Math.PI 和其他数学元素(我假设 Math.Sine 会在那里)让 newAlpha 成为正弦上的数字?

我在想 min 和 max 将是波的放大器,而 rateOfChange 将是 Sine 函数的产物,我只是无法弄清楚它们是如何结合在一起的。

4

3 回答 3

1

您的方程式将如下所示:

替代文字

y 是时间 t 的垂直位置,A 是幅度,f 是频率,t 是时间(或 Android 时钟的滴答声)。

于 2011-01-22T13:13:50.350 回答
0

你为什么不考虑这个?

...在您的班级定义的顶部,包括:-

import java.lang.*;

...在您的职能范围内,在分配给 newAlpha 之后,

newAlpha = Math.sin(newAlpha%(2*Math.PI));

如果您希望 newAlpha 在 [-1,1] 范围内,因为 sin() 函数是

或者

...在你的函数中,在分配给 newAlpha 之后,

newAlpha = Math.asin(newAlpha%3 - 1);

如果您希望 newAlpha 在 [-1,1] 范围内,因为 sin() 函数是

我不确定你的 newAlpha 是什么数据类型,但我会假设它不会影响这个表达式的答案——比如 newAlpha 是 double 类型。

通常,将模数应用于您拥有的任何表达式,即获得一定范围内的数字的方法。expr%N 产生一个范围为 [0,N-1] 的数字。

希望这可以帮助。

于 2011-01-22T13:15:15.673 回答
0

根据 duffymo 的一般方程式,我不得不一直回到我的 TI-83 天(字面意思是,把应用程序放在我的手机上)。但我能够将所有部分放在一起,所以它最终看起来像这样:

newAlpha = (int)((alphaMax - alphaMin) * 0.5 * Math.sin(rateOfChange * ticks + randomPhaseOffset) + (alphaMin + (alphaMax - alphaMin) * 0.5))

FMI:http ://en.wikipedia.org/wiki/Sine_wave

于 2011-01-22T15:35:00.710 回答