// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** package com.jwetherell.openmap.common; public abstract class MoreMath { /** * 2*Math.PI */ public static final transient float TWO_PI = (float) Math.PI * 2.0f; /** * 2*Math.PI */ public static final transient double TWO_PI_D = Math.PI * 2.0d; /** * Math.PI/2 */ public static final transient float HALF_PI = (float) Math.PI / 2.0f; /** * Math.PI/2 */ public static final transient double HALF_PI_D = Math.PI / 2.0d; /** * Checks if a ~= b. Use this to test equality of floating point numbers. * <p> * * @param a * double * @param b * double * @param epsilon * the allowable error * @return boolean */ public static final boolean approximately_equal(double a, double b, double epsilon) { return (Math.abs(a - b) <= epsilon); } /** * Checks if a ~= b. Use this to test equality of floating point numbers. * <p> * * @param a * float * @param b * float * @param epsilon * the allowable error * @return boolean */ public static final boolean approximately_equal(float a, float b, float epsilon) { return (Math.abs(a - b) <= epsilon); } /** * Hyperbolic arcsin. * <p> * Hyperbolic arc sine: log (x+sqrt(1+x^2)) * * @param x * float * @return float asinh(x) */ public static final float asinh(float x) { return (float) Math.log(x + Math.sqrt(x * x + 1)); } /** * Hyperbolic arcsin. * <p> * Hyperbolic arc sine: log (x+sqrt(1+x^2)) * * @param x * double * @return double asinh(x) */ public static final double asinh(double x) { return Math.log(x + Math.sqrt(x * x + 1)); } /** * Hyperbolic sin. * <p> * Hyperbolic sine: (e^x-e^-x)/2 * * @param x * float * @return float sinh(x) */ public static final float sinh(float x) { return (float) (Math.pow(Math.E, x) - Math.pow(Math.E, -x)) / 2.0f; } /** * Hyperbolic sin. * <p> * Hyperbolic sine: (e^x-e^-x)/2 * * @param x * double * @return double sinh(x) */ public static final double sinh(double x) { return (Math.pow(Math.E, x) - Math.pow(Math.E, -x)) / 2.0d; } // HACK - are there functions that already exist? /** * Return sign of number. * * @param x * short * @return int sign -1, 1 */ public static final int sign(short x) { return (x < 0) ? -1 : 1; } /** * Return sign of number. * * @param x * int * @return int sign -1, 1 */ public static final int sign(int x) { return (x < 0) ? -1 : 1; } /** * Return sign of number. * * @param x * long * @return int sign -1, 1 */ public static final int sign(long x) { return (x < 0) ? -1 : 1; } /** * Return sign of number. * * @param x * float * @return int sign -1, 1 */ public static final int sign(float x) { return (x < 0f) ? -1 : 1; } /** * Return sign of number. * * @param x * double * @return int sign -1, 1 */ public static final int sign(double x) { return (x < 0d) ? -1 : 1; } /** * Check if number is odd. * * @param x * short * @return boolean */ public static final boolean odd(short x) { return !even(x); } /** * Check if number is odd. * * @param x * int * @return boolean */ public static final boolean odd(int x) { return !even(x); } /** * Check if number is odd. * * @param x * long * @return boolean */ public static final boolean odd(long x) { return !even(x); } /** * Check if number is even. * * @param x * short * @return boolean */ public static final boolean even(short x) { return ((x & 0x1) == 0); } /** * Check if number is even. * * @param x * int * @return boolean */ public static final boolean even(int x) { return ((x & 0x1) == 0); } /** * Check if number is even. * * @param x * long * @return boolean */ public static final boolean even(long x) { return ((x & 0x1) == 0); } /** * Converts a byte in the range of -128 to 127 to an int in the range 0 - * 255. * * @param b * (-128 <= b <= 127) * @return int (0 <= b <= 255) */ public static final int signedToInt(byte b) { return (b & 0xff); } /** * Converts a short in the range of -32768 to 32767 to an int in the range 0 * - 65535. * * @param w * (-32768 <= b <= 32767) * @return int (0 <= b <= 65535) */ public static final int signedToInt(short w) { return (w & 0xffff); } /** * Convert an int in the range of -2147483648 to 2147483647 to a long in the * range 0 to 4294967295. * * @param x * (-2147483648 <= x <= 2147483647) * @return long (0 <= x <= 4294967295) */ public static final long signedToLong(int x) { return (x & 0xFFFFFFFFL); } /** * Converts an int in the range of 0 - 65535 to an int in the range of 0 - * 255. * * @param w * int (0 <= w <= 65535) * @return int (0 <= w <= 255) */ public static final int wordToByte(int w) { return w >> 8; } /** * Build short out of bytes (in big endian order). * * @param bytevec * bytes * @param offset * byte offset * @return short */ public static final short BuildShortBE(byte bytevec[], int offset) { return (short) (((bytevec[0 + offset]) << 8) | (signedToInt(bytevec[1 + offset]))); } /** * Build short out of bytes (in little endian order). * * @param bytevec * bytes * @param offset * byte offset * @return short */ public static final short BuildShortLE(byte bytevec[], int offset) { return (short) (((bytevec[1 + offset]) << 8) | (signedToInt(bytevec[0 + offset]))); } /** * Build short out of bytes. * * @param bytevec * bytes * @param offset * byte offset * @param MSBFirst * BE or LE? * @return short */ public static final short BuildShort(byte bytevec[], int offset, boolean MSBFirst) { if (MSBFirst) return (BuildShortBE(bytevec, offset)); // else return (BuildShortLE(bytevec, offset)); } /** * Build short out of bytes (in big endian order). * * @param bytevec * bytes * @param MSBFirst * BE or LE? * @return short */ public static final short BuildShortBE(byte bytevec[], boolean MSBFirst) { return BuildShortBE(bytevec, 0); } /** * Build short out of bytes (in little endian order). * * @param bytevec * bytes * @param MSBFirst * BE or LE? * @return short */ public static final short BuildShortLE(byte bytevec[], boolean MSBFirst) { return BuildShortLE(bytevec, 0); } /** * Build short out of bytes. * * @param bytevec * bytes * @param MSBFirst * BE or LE? * @return short */ public static final short BuildShort(byte bytevec[], boolean MSBFirst) { return BuildShort(bytevec, 0, MSBFirst); } /** * Build int out of bytes (in big endian order). * * @param bytevec * bytes * @param offset * byte offset * @return int */ public static final int BuildIntegerBE(byte bytevec[], int offset) { return (((bytevec[0 + offset]) << 24) | (signedToInt(bytevec[1 + offset]) << 16) | (signedToInt(bytevec[2 + offset]) << 8) | (signedToInt(bytevec[3 + offset]))); } /** * Build int out of bytes (in little endian order). * * @param bytevec * bytes * @param offset * byte offset * @return int */ public static final int BuildIntegerLE(byte bytevec[], int offset) { return (((bytevec[3 + offset]) << 24) | (signedToInt(bytevec[2 + offset]) << 16) | (signedToInt(bytevec[1 + offset]) << 8) | (signedToInt(bytevec[0 + offset]))); } /** * Build int out of bytes. * * @param bytevec * bytes * @param offset * byte offset * @param MSBFirst * BE or LE? * @return int */ public static final int BuildInteger(byte bytevec[], int offset, boolean MSBFirst) { if (MSBFirst) return BuildIntegerBE(bytevec, offset); // else return BuildIntegerLE(bytevec, offset); } /** * Build int out of bytes (in big endian order). * * @param bytevec * bytes * @return int */ public static final int BuildIntegerBE(byte bytevec[]) { return BuildIntegerBE(bytevec, 0); } /** * Build int out of bytes (in little endian order). * * @param bytevec * bytes * @return int */ public static final int BuildIntegerLE(byte bytevec[]) { return BuildIntegerLE(bytevec, 0); } /** * Build int out of bytes. * * @param bytevec * bytes * @param MSBFirst * BE or LE? * @return int */ public static final int BuildInteger(byte bytevec[], boolean MSBFirst) { if (MSBFirst) return BuildIntegerBE(bytevec, 0); //else return BuildIntegerLE(bytevec, 0); } /** * Build long out of bytes (in big endian order). * * @param bytevec * bytes * @param offset * byte offset * @return long */ public static final long BuildLongBE(byte bytevec[], int offset) { return (((long) signedToInt(bytevec[0 + offset]) << 56) | ((long) signedToInt(bytevec[1 + offset]) << 48) | ((long) signedToInt(bytevec[2 + offset]) << 40) | ((long) signedToInt(bytevec[3 + offset]) << 32) | ((long) signedToInt(bytevec[4 + offset]) << 24) | ((long) signedToInt(bytevec[5 + offset]) << 16) | ((long) signedToInt(bytevec[6 + offset]) << 8) | (signedToInt(bytevec[7 + offset]))); } /** * Build long out of bytes (in little endian order). * * @param bytevec * bytes * @param offset * byte offset * @return long */ public static final long BuildLongLE(byte bytevec[], int offset) { return (((long) signedToInt(bytevec[7 + offset]) << 56) | ((long) signedToInt(bytevec[6 + offset]) << 48) | ((long) signedToInt(bytevec[5 + offset]) << 40) | ((long) signedToInt(bytevec[4 + offset]) << 32) | ((long) signedToInt(bytevec[3 + offset]) << 24) | ((long) signedToInt(bytevec[2 + offset]) << 16) | ((long) signedToInt(bytevec[1 + offset]) << 8) | (signedToInt(bytevec[0 + offset]))); } /** * Build long out of bytes. * * @param bytevec * bytes * @param offset * byte offset * @param MSBFirst * BE or LE? * @return long */ public static final long BuildLong(byte bytevec[], int offset, boolean MSBFirst) { if (MSBFirst) return BuildLongBE(bytevec, offset); // else return BuildLongLE(bytevec, offset); } /** * Build long out of bytes (in big endian order). * * @param bytevec * bytes * @return long */ public static final long BuildLongBE(byte bytevec[]) { return BuildLongBE(bytevec, 0); } /** * Build long out of bytes (in little endian order). * * @param bytevec * bytes * @return long */ public static final long BuildLongLE(byte bytevec[]) { return BuildLongLE(bytevec, 0); } /** * Build long out of bytes. * * @param bytevec * bytes * @param MSBFirst * BE or LE? * @return long */ public static final long BuildLong(byte bytevec[], boolean MSBFirst) { if (MSBFirst) return BuildLongBE(bytevec, 0); // else return BuildLongLE(bytevec, 0); } }