我目前有一个使用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)
我该怎么做?
答案 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而不是第一个的旧值更新第二个。
假设:
(“持久性”,如“在更新代码的执行中保持价值”, 与“临时”相反,如“仅在更新代码中保留值”; 这是为了避免使用“全局”属性,这意味着数据设计不佳)
更新代码:
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)
也有帮助。