Source: sources/geomathics/trigonometries.js

/**
 * @author [Tristan Valcke]{@link https://github.com/Itee}
 * @license [BSD-3-Clause]{@link https://opensource.org/licenses/BSD-3-Clause}
 *
 * @module sources/geomathics/trigonometries
 */
import {
    isNotDefined,
    isNotObject
} from 'itee-validators'

export const PI   = Math.PI
export const PI_2 = Math.PI / 2
export const PI_4 = Math.PI / 4

export const DEG_TO_RAD = ( PI / 180 )
export const RAD_TO_DEG = ( 180 / PI )

/**
 *
 * @param {number} degrees
 * @return {number}
 */
export function degreesToRadians ( degrees ) {
    return degrees * DEG_TO_RAD
}

/**
 *
 * @param {number} radians
 * @return {number}
 */
export function degreesFromRadians ( radians ) {
    return radians * RAD_TO_DEG
}

/**
 *
 * @param {number} radians
 * @return {number}
 */
export function radiansToDegrees ( radians ) {
    return radians * RAD_TO_DEG
}

/**
 *
 * @param {number} degrees
 * @return {number}
 */
export function radiansFromDegrees ( degrees ) {
    return degrees * DEG_TO_RAD
}

// PROJECTION 2D/3D
/**
 *
 * @param {Vector} vector
 * @return {number}
 */
export function getYaw ( vector ) {
    if(isNotDefined(vector)) { return }
    if(isNotObject(vector)) { return }

    return -Math.atan2( vector.x, vector.z )
}

/**
 *
 * @param {Vector} vector
 * @return {number}
 */
export function getPitch ( vector ) {
    if(isNotDefined(vector)) { return }
    if(isNotObject(vector)) { return }

    return Math.asin( vector.y )
}

/**
 *
 * @param {Vector} vectorDir
 * @return {{yaw: number, pitch: number}}
 */
export function convertWebGLRotationToTopogicalYawPitch ( vectorDir ) {
    if(isNotDefined(vectorDir)) { return }
    if(isNotObject(vectorDir)) { return }

    function getYaw ( vector ) {
        return Math.atan2( vector.y, vector.x )
    }

    function getPitch ( vector ) {
        return Math.asin( vector.z )
    }

    const topoVectorDir = vectorDir //convertWebglVectorToTopologicVector( vectorDir )

    return {
        yaw:   -( radiansToDegrees( getYaw( topoVectorDir ) ) - 90 ),
        pitch: radiansToDegrees( getPitch( topoVectorDir ) )
    }

}

///**
// * TRIGONOMETRIC CIRCLE CONCEPT WITH INTEGRATED TIMER
// *
// * Provide position on any given referential (starting position)
// * this position is updated every tick on a trigonometric circle of rayon (radius)
// * and give new position in px about this point in current referential.
// *
// * @param settings
// * @constructor
// */
//function TTrigonometricCircle ( settings ) {
//
//    var _ = this;
//
//    _.options = $.extend( {}, TTrigonometricCircle.DEFAULT_SETTINGS, settings );
//
//}
//
//Object.assign( TTrigonometricCircle, {
//
//    /**
//     *
//     */
//    DEFAULT_SETTINGS: {
//        angle:       0,
//        radius:      10
//    }
//
//} )
//
//Object.assign( TTrigonometricCircle.prototype, {
//
//    /**
//     *
//     * @param increment
//     */
//    increment ( increment ) {
//        var _   = this;
//        _.angle = (increment ? _.angle + increment : _.angle + 1);
//        if ( _.angle >= 360 ) {
//            _.angle = 0;
//        }
//    },
//
//    /**
//     *
//     */
//    getRadius () {
//        var _ = this;
//        return _.radius;
//    },
//
//    /**
//     *
//     * @return {number}
//     */
//    getCosinus () {
//        var _ = this;
//        return Math.cos( degreesToRadians( _.angle ) ) * _.radius;
//    },
//
//    /**
//     *
//     * @return {number}
//     */
//    getSinus () {
//        var _ = this;
//        return Math.sin( degreesToRadians( _.angle ) ) * _.radius;
//    }
//
//} )
//
///////////
//
///**
// *
// * @param settings
// * @constructor
// */
//function TTrigonometricCone ( settings ) {
//
//    var _ = this;
//
//    _.model = $.extend( {}, TTrigonometricCone.DEFAULT_SETTINGS, settings );
//}
//
//Object.assign( TTrigonometricCone, {
//
//    /**
//     *
//     */
//    DEFAULT_SETTINGS: {
//        angle:       0,
//        height:      10,
//        radius:      10
//    }
//
//} )
//
//Object.assign( TTrigonometricCone.prototype, {
//
//    /**
//     *
//     * @param increment
//     */
//    increment ( increment ) {
//        var _         = this;
//        _.model.angle = (increment ? _.model.angle + increment : _.model.angle + 1);
//        if ( _.model.angle >= 360 ) {
//            _.model.angle = 0;
//        }
//    },
//
//    /**
//     *
//     */
//    getRadius () {
//        var _ = this;
//        return _.model.radius;
//    },
//
//    /**
//     *
//     * @return {number}
//     */
//    getCosinus () {
//        var _ = this;
//        return Math.cos( degreesToRadians( _.model.angle ) ) * _.model.radius;
//    },
//
//    /**
//     *
//     * @return {number}
//     */
//    getSinus () {
//        var _ = this;
//        return Math.sin( degreesToRadians( _.model.angle ) ) * _.model.radius;
//    },
//
//    /**
//     *
//     * @param height
//     * @return {number}
//     */
//    getCosinusForHeight ( height ) {
//        var _ = this;
//        return Math.cos( degreesToRadians( _.model.angle ) ) * ((_.model.radius / _.model.height) * Math.abs( height ) );
//    },
//
//    /**
//     *
//     * @param height
//     * @return {number}
//     */
//    getSinusForHeight ( height ) {
//        var _ = this;
//        return Math.sin( degreesToRadians( _.model.angle ) ) * ((_.model.radius / _.model.height) * Math.abs( height ));
//    }
//
//} )