package org.newdawn.slick.util;
/**
* Utility to handle Java's odd trig performance issues
*
* @author JeffK
*/
public class FastTrig {
/**
* Fast Trig functions for x86.
* This forces the trig functiosn to stay within the safe area on the x86 processor (-45 degrees to +45 degrees)
* The results may be very slightly off from what the Math and StrictMath trig functions give due to
* rounding in the angle reduction but it will be very very close.
*
* @param radians The original angle
* @return The reduced Sin angle
*/
private static double reduceSinAngle(double radians) {
double orig = radians;
radians %= Math.PI * 2.0; // put us in -2PI to +2PI space
if (Math.abs(radians) > Math.PI) { // put us in -PI to +PI space
radians = radians - (Math.PI * 2.0);
}
if (Math.abs(radians) > Math.PI / 2) {// put us in -PI/2 to +PI/2 space
radians = Math.PI - radians;
}
return radians;
}
/**
* Get the sine of an angle
*
* @param radians The angle
* @return The sine of the angle
*/
public static double sin(double radians) {
radians = reduceSinAngle(radians); // limits angle to between -PI/2 and +PI/2
if (Math.abs(radians) <= Math.PI / 4) {
return Math.sin(radians);
} else {
return Math.cos(Math.PI / 2 - radians);
}
}
/**
* Get the cosine of an angle
*
* @param radians The angle
* @return The cosine of the angle
*/
public static double cos(double radians) {
return sin(radians + Math.PI / 2);
}
}