Java sin to cos sinToCos(double angle, double sin)

Here you can find the source of sinToCos(double angle, double sin)

Description

Fast way of computing cos(x) from x and sin(x).

License

Open Source License

Parameter

Parameter Description
angle Input angle x
sin Sine of x.

Return

Cosine of x

Declaration

public static double sinToCos(double angle, double sin) 

Method Source Code

//package com.java2s;
/*//from  w  w  w  .ja va 2s  .  com
 This file is part of ELKI:
 Environment for Developing KDD-Applications Supported by Index-Structures
    
 Copyright (C) 2015
 Ludwig-Maximilians-Universit?t M?nchen
 Lehr- und Forschungseinheit f?r Datenbanksysteme
 ELKI Development Team
    
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
    
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Affero General Public License for more details.
    
 You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

public class Main {
    /**
     * Two times Pi.
     */
    public static final double TWOPI = 2. * Math.PI;
    /**
     * Half the value of Pi.
     */
    public static final double HALFPI = .5 * Math.PI;
    /**
     * 1.5 times Pi.
     */
    public static final double ONEHALFPI = 1.5 * Math.PI;

    /**
     * <b>Fast</b> way of computing cos(x) from x and sin(x).
     *
     * @param angle Input angle x
     * @param sin Sine of x.
     * @return Cosine of x
     */
    public static double sinToCos(double angle, double sin) {
        // Numerics of the formula below aren't too good.
        if ((-1e-5 < sin && sin < 1e-5) || sin > 0.99999 || sin < -0.99999) {
            return Math.cos(angle);
        }
        angle = normAngle(angle);
        final double s = Math.sqrt(1 - sin * sin);
        return (angle < HALFPI || angle > ONEHALFPI) ? s : -s;
    }

    /**
     * Normalize an angle to [0:2pi[
     *
     * @param x Input angle
     * @return Normalized angle
     */
    public static double normAngle(double x) {
        x %= TWOPI;
        return (x > 0) ? x : x + TWOPI;
    }
}