diff options
Diffstat (limited to 'src/main/java/ihl/utils/IHLMathUtils.java')
| -rw-r--r-- | src/main/java/ihl/utils/IHLMathUtils.java | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/main/java/ihl/utils/IHLMathUtils.java b/src/main/java/ihl/utils/IHLMathUtils.java new file mode 100644 index 0000000..8cab3c9 --- /dev/null +++ b/src/main/java/ihl/utils/IHLMathUtils.java @@ -0,0 +1,103 @@ +package ihl.utils; + +public class IHLMathUtils { + private final static int accuracy_level = 1024; + private final static float[] sqrt_table = new float[accuracy_level]; + + public static float sqrt(float value) { + float value1 = value; + int multiplier = 1; + while (value1 >= 1.0f) { + multiplier=multiplier<<2; + value1 = value / (multiplier * multiplier); + } + return multiplier * sqrt_table[(int) (value1 * accuracy_level)]; + } + + public static float[] vector_vector_multiply(float[] v1, float[] v2) { + float c_x = v1[1] * v2[2] - v2[1] * v1[2]; + float c_y = v2[0] * v1[2] - v1[0] * v2[2]; + float c_z = v1[0] * v2[1] - v2[0] * v1[1]; + return new float[] { c_x, c_y, c_z }; + } + + public static void normalize_vector(float[] v1) { + float d = (float) Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]); + if (d == 0) { // Nothing can we do. Create new vector towards up + // direction. + v1[0] = 0; + v1[1] = 1; + v1[2] = 0; + } else { + v1[0] /= d; + v1[1] /= d; + v1[2] /= d; + } + } + + public static void scale_vector_to_value(float[] v1, float v2) { + float d = (float) Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]); + if (d == 0) { // Nothing can we do. Create new vector towards up + // direction. + v1[0] = 0; + v1[1] = v2; + v1[2] = 0; + } else { + v1[0] = v1[0] * v2 / d; + v1[1] = v1[1] * v2 / d; + v1[2] = v1[2] * v2 / d; + } + } + + public static void vector_add(float[] fs, float x, float y, float z) { + fs[0] += x; + fs[1] += y; + fs[2] += z; + } + + static { + for (int i = 0; i < accuracy_level; i++) { + sqrt_table[i] = (float) Math.sqrt((double) i / accuracy_level); + } + } + + public static float[] vector_return_difference(double[] v1, double[] v2) { + return new float[] { (float) (v1[0] - v2[0]), (float) (v1[1] - v2[1]), (float) (v1[2] - v2[2]) }; + } + + public static float[] vector_return_difference(float[] v1, double[] v2) { + return new float[] { (float) (v1[0] - v2[0]), (float) (v1[1] - v2[1]), (float) (v1[2] - v2[2]) }; + } + + public static float[] vector_return_difference(int[] v1, double[] v2) { + return new float[] { (float) (v1[0] - v2[0]), (float) (v1[1] - v2[1]), (float) (v1[2] - v2[2]) }; + } + + public static void multiply_vector_to_value(float[] v1, float v2) { + v1[0] *= v2; + v1[1] *= v2; + v1[2] *= v2; + } + + public static void vector_add(double[] v1, float[] v2) { + v1[0] += v2[0]; + v1[1] += v2[1]; + v1[2] += v2[2]; + } + + public static float[] get_triangle_normal(double[][] triangle1) { + float[] v1 = vector_return_difference(triangle1[1], triangle1[0]); + float[] v2 = vector_return_difference(triangle1[2], triangle1[0]); + return vector_vector_multiply(v1, v2); + } + + public static int sign(int value) { + if (value > 0) + return 1; + else if (value < 0) + return -1; + else + return 0; + } + +} |
