Fast trigonometric operations : Geometry « 2D Graphics GUI « Java

Fast trigonometric operations

```
//package com.ryanm.droid.rugl.util;

/**
* Fast trigonometric operations
*
* @author Riven
*/
public class Trig {
/**
* I'm sick of casting to float
*/
public static final float PI = (float) Math.PI;

/**
* I'm also sick of multiplying by two
*/
public static final float TWO_PI = 2 * PI;

/**
* Honestly, who has the time to divide by two?
*/
public static final float HALF_PI = PI / 2;

private static final int ATAN2_BITS = 7;

private static final int ATAN2_BITS2 = ATAN2_BITS << 1;

private static final int ATAN2_MASK = ~(-1 << ATAN2_BITS2);

private static final int ATAN2_COUNT = ATAN2_MASK + 1;

private static final int ATAN2_DIM = (int) Math.sqrt(ATAN2_COUNT);

private static final float ATAN2_DIM_MINUS_1 = ATAN2_DIM - 1;

private static final float[] atan2 = new float[ATAN2_COUNT];

private static final int SIN_BITS, SIN_MASK, SIN_COUNT;

private static final float[] sin, cos;

static {
for (int i = 0; i < ATAN2_DIM; i++) {
for (int j = 0; j < ATAN2_DIM; j++) {
float x0 = (float) i / ATAN2_DIM;
float y0 = (float) j / ATAN2_DIM;

atan2[j * ATAN2_DIM + i] = (float) Math.atan2(y0, x0);
}
}

SIN_BITS = 12;

radFull = (float) (Math.PI * 2.0);

sin = new float[SIN_COUNT];
cos = new float[SIN_COUNT];

for (int i = 0; i < SIN_COUNT; i++) {
sin[i] = (float) Math.sin((i + 0.5f) / SIN_COUNT * radFull);
cos[i] = (float) Math.cos((i + 0.5f) / SIN_COUNT * radFull);
}
}

/**
* Like {@link Math#sin(double)}, but a lot faster and a bit less accurate
*
*/
public static final float sin(float rad) {
}

/**
* Like {@link Math#cos(double)}, but a lot faster and a bit less accurate
*
*/
public static final float cos(float rad) {
}

/**
* @param y
* @param x
* @return the angle to (x,y)
*/
public static final float atan2(float y, float x) {

if (x < 0.0f) {
if (y < 0.0f) {
x = -x;
y = -y;

mul = 1.0f;
} else {
x = -x;
mul = -1.0f;
}

} else {
if (y < 0.0f) {
y = -y;
mul = -1.0f;
} else {
mul = 1.0f;
}

}

float invDiv = ATAN2_DIM_MINUS_1 / (x < y ? y : x);

int xi = (int) (x * invDiv);
int yi = (int) (y * invDiv);

return (atan2[yi * ATAN2_DIM + xi] + add) * mul;
}

/**
* @param degrees
*/
public static float toRadians(float degrees) {
return degrees / 180.0f * Trig.PI;
}

/**
* @return the degrees value
*/
public static float toDegrees(float radians) {
return radians * 180.0f / Trig.PI;
}
}

```

Related examples in the same category

 1 Collection of geometry utility methods 2 Unions Rectangle2D 3 Interpolates points given in the 2D plane 4 Returns distance between two sets of coords 5 Returns distance between 3D set of coords 6 Returns closest point on segment to point 7 Calculate Angle From 8 Returns distance to segment 9 Hexagon demo 10 Implements an Vector in 3D space. 11 Implementation of the 4 dimensional vector. 12 Quaternion 13 Circle shape 14 Geometry Utilities 15 This is a Polygon that allows the user to flip and swap the points along it's axis. 16 A class to represent a latitude and longitude 17 An undirected graph that keeps track of connected components (groups). 18 Generates n logarithmically-spaced points between d1 and d2 using the provided base. 19 Returns a dimension where width and height are inside the bounds of the maxWidth and maxHeight parameters