转换sin计算以使用每帧增量

时间:2018-03-08 18:43:17

标签: math timestamp trigonometry timedelta

我目前有一个使用sin函数更新值的函数,以及一个跟踪自程序启动以来经过多长时间的timeFactor double:

double timeFactor;
double delta;
while(running) {
  delta = currentTime - lastTime;
  timeFactor += delta;
  var objectX = sin(timeFactor);
}

但是,我需要将此代码转换为使用delta而不是timeFactor 即为了更新到sin(时间+ delta),我只想使用sin(时间)的当前值和从delta值计算的任何值。
即计算sin(时间+ delta)== f(sin(时间),delta)

我该怎么做?

1 个答案:

答案 0 :(得分:3)

从数学:
sin(A + B)== sin(A)* cos(B)+ cos(A)* sin(B)
cos(A + B)== cos(A)* cos(B) - sin(A)* sin(B)

将sin(A)和cos(A)存储在两个变量中。 然后更新它们使用其中一个的临时副本,否则你将使用new而不是第一个的旧值更新第二个。

假设:

  • 持久对象X存储当前并初始化为初始sin(timeFactor)
  • 持久化objectXc存储当前值并使用初始cos(timeFactor)
  • 进行初始化
  • 临时objectXt存储objectX的副本

(“持久性”,如“在更新代码的执行中保持价值”,  与“临时”相反,如“仅在更新代码中保留值”;  这是为了避免使用“全局”属性,这意味着数据设计不佳)

更新代码:

objectXt = objectX;
objectX  = objectX * cos(delta) + objectXc * sin(delta);
objectXc = objectXc* cos(delta) - objectXt * sin(delta);

致John Coleman在最初想法中发现问题的信用 1 == sin(A)* sin(A)+ cos(A)* cos(A)
那本来是实际的 sin(时间+ delta)== f(sin(时间),delta)
但它在整个时期的50%失败 所以我希望这个 sin(时间+ delta)== f(sin(时间),cos(时间),delta)
也有帮助。