tcr/java/src/game/util/ExtMath.java
2025-03-12 18:13:11 +01:00

163 lines
3.2 KiB
Java
Executable file

package game.util;
public abstract class ExtMath {
private static final float[] SIN_TABLE = new float[65536];
private static final double ATAN_ADD = Double.longBitsToDouble(4805340802404319232L);
private static final double[] ATAN_SIN = new double[257];
private static final double[] ATAN_COS = new double[257];
static {
for(int z = 0; z < 65536; z++) {
SIN_TABLE[z] = (float)Math.sin((double)z * Math.PI * 2.0D / 65536.0D);
}
for(int z = 0; z < 257; z++) {
double a = Math.asin((double)z / 256.0D);
ATAN_COS[z] = Math.cos(a);
ATAN_SIN[z] = a;
}
}
public static float sin(float value) {
return SIN_TABLE[(int)(value * 10430.378F) & 65535];
}
public static float cos(float value) {
return SIN_TABLE[(int)(value * 10430.378F + 16384.0F) & 65535];
}
public static float sqrtf(float value) {
return (float)Math.sqrt((double)value);
}
public static float sqrtd(double value) {
return (float)Math.sqrt(value);
}
public static int floorf(float value) {
int i = (int)value;
return value < (float)i ? i - 1 : i;
}
public static int floord(double value) {
int i = (int)value;
return value < (double)i ? i - 1 : i;
}
public static float absf(float value) {
return value >= 0.0F ? value : -value;
}
public static int absi(int value) {
return value >= 0 ? value : -value;
}
public static int ceilf(float value) {
int i = (int)value;
return value > (float)i ? i + 1 : i;
}
public static int ceild(double value) {
int i = (int)value;
return value > (double)i ? i + 1 : i;
}
public static int clampi(int num, int min, int max) {
return num < min ? min : (num > max ? max : num);
}
public static float clampf(float num, float min, float max) {
return num < min ? min : (num > max ? max : num);
}
public static double clampd(double num, double min, double max) {
return num < min ? min : (num > max ? max : num);
}
public static float wrapf(float value) {
value = value % 360.0F;
if(value >= 180.0F) {
value -= 360.0F;
}
if(value < -180.0F) {
value += 360.0F;
}
return value;
}
public static double wrapd(double value) {
value = value % 360.0D;
if(value >= 180.0D) {
value -= 360.0D;
}
if(value < -180.0D) {
value += 360.0D;
}
return value;
}
public static double atan2(double v1, double v2) {
double d0 = v2 * v2 + v1 * v1;
if(Double.isNaN(d0)) {
return Double.NaN;
}
else {
boolean flag = v1 < 0.0D;
if(flag) {
v1 = -v1;
}
boolean flag1 = v2 < 0.0D;
if(flag1) {
v2 = -v2;
}
boolean flag2 = v1 > v2;
if(flag2) {
double d1 = v2;
v2 = v1;
v1 = d1;
}
double p1 = 0.5D * d0;
long li = Double.doubleToRawLongBits(d0);
li = 6910469410427058090L - (li >> 1);
d0 = Double.longBitsToDouble(li);
d0 = d0 * (1.5D - p1 * d0 * d0);
v2 = v2 * d0;
v1 = v1 * d0;
double d2 = ATAN_ADD + v1;
int i = (int)Double.doubleToRawLongBits(d2);
double d3 = ATAN_SIN[i];
double d4 = ATAN_COS[i];
double d5 = d2 - ATAN_ADD;
double d6 = v1 * d4 - v2 * d5;
double d7 = (6.0D + d6 * d6) * d6 * 0.16666666666666666D;
double d8 = d3 + d7;
if(flag2) {
d8 = (Math.PI / 2D) - d8;
}
if(flag1) {
d8 = Math.PI - d8;
}
if(flag) {
d8 = -d8;
}
return d8;
}
}
}