package ch.epfl.isochrone.math;

import static java.lang.Math.*;

/**
 * Methodes mathématiques servant a l'ensemble du projet.
 * 
 * @author Charles Thiebaut (238935)
 * @author Arnaud Delamare (234841)
 * 
 */
public final class Math {

    private Math() {
    }

    /**
     * @return l'arcsin de la valeur passé en argument.
     */
    public static double asinh(double x) {
        return log(x + sqrt(1 + x * x));
    }

    /**
     * @return haversin de la valeur passé en argument.
     */
    public static double haversin(double x) {
        return pow(sin(x / 2), 2);
    }

    /**
     * @return le quotient de la division par défaut des valeurs passé en
     *         argument.
     */
    public static int divF(int n, int d) {
        if (d == 0) {
            throw new IllegalArgumentException("Division par 0 !");
        }

        int i;
        int Qt = n / d;
        int Rt = n % d;
        if (signum(Rt) == -signum(d)) {
            i = 1;
        } else {
            i = 0;
        }

        return (Qt - i);
    }

    /**
     * @return le modulo des valeurs passé en argument.
     */
    public static int modF(int n, int d) {
        int Rt = n % d;
        int i;
        if (signum(Rt) == -signum(d)) {
            i = 1;
        } else {
            i = 0;
        }

        return Rt + i * d;
    }
}
