Math.sin
Java フレームワークの現在のバージョンでは、値 ではなく、数学的に完全な値 2π を使用して引数を mod-reduce しようとしますMath.PI*2
。あなたのようなコードの場合、これは、乗算で使用されたのと同じスケール係数 (つまり ) を使用して mod リダクションが実行された場合よりも、コードに時間がかかり、結果の精度が低下することを意味します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
}
これにより、ドキュメンテーションによると、Java が低速で非生産的な範囲縮小の使用に切り替わるポイントである π/4 より大きい引数では、どちらsin
も使用されないことが保証されます。cos