/*
 * File: gmath.h
 * -------------
 * This file exports several functions for working with graphical geometry
 * along with the mathematical constants PI and E.
 */

/*************************************************************************/
/* Stanford Portable Library                                             */
/* Copyright (c) 2014 by Eric Roberts <eroberts@cs.stanford.edu>         */
/*                                                                       */
/* This program is free software: you can redistribute it and/or modify  */
/* it under the terms of the GNU 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 General Public License for more details.                          */
/*                                                                       */
/* You should have received a copy of the GNU General Public License     */
/* along with this program.  If not, see <http://www.gnu.org/licenses/>. */
/*************************************************************************/

#ifndef _gmath_h
#define _gmath_h

#include "gtypes.h"

/*
 * Constant: PI
 * ------------
 * The mathematical constant pi, which is the ratio of the circumference of
 * a circle to its diameter.
 */

extern const double PI;

/*
 * Constant: E
 * -----------
 * The mathematical constant e, which is the base of natural logarithms.
 */

extern const double E;

/*
 * Function: sinDegrees
 * Usage: double sine = sinDegrees(angle);
 * ---------------------------------------
 * Returns the trigonometric sine of angle, which is expressed in degrees.
 */

double sinDegrees(double angle);

/*
 * Function: cosDegrees
 * Usage: double cosine = cosDegrees(angle);
 * -----------------------------------------
 * Returns the trigonometric cosine of angle, which is expressed in
 * degrees.
 */

double cosDegrees(double angle);

/*
 * Function: tanDegrees
 * Usage: double tangent = tanDegrees(angle);
 * ------------------------------------------
 * Returns the trigonometric tangent of angle, which is expressed in
 * degrees.
 */

double tanDegrees(double angle);

/*
 * Function: toDegrees
 * Usage: double degrees = toDegrees(radians);
 * -------------------------------------------
 * Converts an angle from radians to degrees.
 */

double toDegrees(double radians);

/*
 * Function: toRadians
 * Usage: double radians = toRadians(degrees);
 * -------------------------------------------
 * Converts an angle from degrees to radians.
 */

double toRadians(double degrees);

/*
 * Function: vectorDistance
 * Usage: double r = vectorDistance(pt);
 *        double r = vectorDistance(x, y);
 * ---------------------------------------
 * Computes the distance between the origin and the specified point.
 */

double vectorDistance(const GPoint & pt);
double vectorDistance(double x, double y);

/*
 * Function: vectorAngle
 * Usage: double angle = vectorAngle(pt);
 *        double angle = vectorAngle(x, y);
 * ----------------------------------------
 * Returns the angle in degrees from the origin to the specified point. 
 * This function takes account of the fact that the graphics coordinate
 * system is flipped in the y direction from the traditional Cartesian
 * plane.
 */

double vectorAngle(const GPoint & pt);
double vectorAngle(double x, double y);

#endif