package rajawali.math; public class MathUtil { public static final int PRECISION = 0x020000; public static final float PI = 3.14159265f; public static final float TWO_PI = PI * 2f; public static final float HALF_PI = PI * .5f; public static final float PRE_PI_DIV_180 = PI / 180f; public static final float PRE_180_DIV_PI = 180f / PI; private static final float RAD_SLICE = TWO_PI / (float)PRECISION; private static final float PRECISION_DIV_2PI = PRECISION / TWO_PI; private static final int PRECISION_S = PRECISION - 1; private static float[] sinTable = new float[PRECISION]; private static float[] tanTable = new float[PRECISION]; @SuppressWarnings("unused") private static boolean isInitialized = initialize(); public static boolean initialize() { float rad = 0; for(int i=0; i<PRECISION; ++i) { rad = (float)i * RAD_SLICE; sinTable[i] = (float)Math.sin(rad); tanTable[i] = (float)Math.tan(rad); } return true; } private static int radToIndex(float radians) { return (int)(radians * PRECISION_DIV_2PI) & PRECISION_S; } public static float sin(double radians) { return sin((float)radians); } public static float sin(float radians) { return sinTable[radToIndex(radians)]; } public static float cos(double radians) { return cos((float)radians); } public static float cos(float radians) { return sinTable[radToIndex(HALF_PI-radians)]; } public static float tan(double radians) { return tan((float)radians); } public static float tan(float radians) { return tanTable[radToIndex(radians)]; } public static float degreesToRadians(final float degrees) { return degrees * PRE_PI_DIV_180; } public static float radiansToDegrees(final float radians) { return radians * PRE_180_DIV_PI; } public static boolean realEqual(float a, float b, float tolerance) { if (Math.abs(b - a) <= tolerance) return true; else return false; } public static int getClosestPowerOfTwo(int x) { --x; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return ++x; } }