Java 框架的当前版本将尝试对参数进行 mod-reduce,以Math.sin
使用数学上完美的值 2π,而不是 value Math.PI*2
。对于像您这样的代码,这意味着与使用与乘法中使用的相同比例因子(即Math.PI*2
)执行模归约相比,代码将花费更长的时间并且产生的结果准确度更低。为了获得良好的准确性和速度,您应该在进行乘法之前执行模减少,使用类似的方法:
double thisSpin = t * frequency;
thisSpin -= (thisSpin - Math.Floor(thisSpin)) * 8.0; // value of 0-7.9999=one rotation
switch((int)(thisSpin*8.0))
{
case 0: return Math.sin( thisSpin * (Math.PI/4.0));
case 1: return Math.cos((2-thisSpin) * (Math.PI/4.0));
case 2: return Math.cos((thisSpin-2) * (Math.PI/4.0));
case 3: return Math.sin((4-thisSpin) * (Math.PI/4.0));
case 4: return -Math.sin((thisSpin-4) * (Math.PI/4.0));
case 5: return -Math.cos((6-thisSpin) * (Math.PI/4.0));
case 6: return -Math.cos((thisSpin-6) * (Math.PI/4.0));
case 7: return -Math.sin((8-thisSpin) * (Math.PI/4.0));
default: return 0; // Shouldn't be possible, but thisSpin==8 would be congruent to 0
}
这将确保既不sin
也不cos
使用大于 π/4 的参数,根据文档,这是 Java 切换到使用缓慢且适得其反的范围缩小的点。