⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geometry.cpp

📁 This is an usefull library for Geometry in Mathmatics
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "Geometry.h"#include <stdio.h>    // needed for sprintf/*! This function returns the sign of a give double.    1 is positive, -1 is negative    \param d1 first parameter    \return the sign of this double */int sign( double d1 ){  return (d1>0)?1:-1;}/*! This function returns the maximum of two given doubles.    \param d1 first parameter    \param d2 second parameter    \return the maximum of these two parameters */double max( double d1, double d2 ){  return (d1>d2)?d1:d2;}/*! This function returns the minimum of two given doubles.    \param d1 first parameter    \param d2 second parameter    \return the minimum of these two parameters */double min( double d1, double d2 ){  return (d1<d2)?d1:d2;}/*! This function converts an angle in radians to the corresponding angle in    degrees.    \param x an angle in radians    \return the corresponding angle in degrees */AngDeg Rad2Deg( AngRad x ){  return ( x * 180 / M_PI );}/*! This function converts an angle in degrees to the corresponding angle in    radians.    \param x an angle in degrees    \return the corresponding angle in radians */AngRad Deg2Rad( AngDeg x ){  return ( x * M_PI / 180 );}/*! This function returns the cosine of a given angle in degrees using the    built-in cosine function that works with angles in radians.    \param x an angle in degrees    \return the cosine of the given angle */double cosDeg( AngDeg x ){  return ( cos( Deg2Rad( x ) ) );}/*! This function returns the sine of a given angle in degrees using the    built-in sine function that works with angles in radians.    \param x an angle in degrees    \return the sine of the given angle */double sinDeg( AngDeg x ){  return ( sin( Deg2Rad( x ) ) );}/*! This function returns the tangent of a given angle in degrees using the    built-in tangent function that works with angles in radians.    \param x an angle in degrees    \return the tangent of the given angle */double tanDeg( AngDeg x ){  return ( tan( Deg2Rad( x ) ) );}/*! This function returns the principal value of the arc tangent of x    in degrees using the built-in arc tangent function which returns    this value in radians.    \param x a double value    \return the arc tangent of the given value in degrees */AngDeg atanDeg( double x ){  return ( Rad2Deg( atan( x ) ) );}/*! This function returns the principal value of the arc tangent of y/x in    degrees using the signs of both arguments to determine the quadrant of the    return value. For this the built-in 'atan2' function is used which returns    this value in radians.    \param x a double value    \param y a double value    \return the arc tangent of y/x in degrees taking the signs of x and y into    account */double atan2Deg( double x, double y ){  if( fabs( x ) < EPSILON && fabs( y ) < EPSILON )    return ( 0.0 );  return ( Rad2Deg( atan2( x, y ) ) );}/*! This function returns the principal value of the arc cosine of x in degrees    using the built-in arc cosine function which returns this value in radians.    \param x a double value    \return the arc cosine of the given value in degrees */AngDeg acosDeg( double x ){  if( x >= 1 )    return ( 0.0 );  else if( x <= -1 )    return ( 180.0 );  return ( Rad2Deg( acos( x ) ) );}/*! This function returns the principal value of the arc sine of x in degrees    using the built-in arc sine function which returns this value in radians.    \param x a double value    \return the arc sine of the given value in degrees */AngDeg asinDeg( double x ){  if( x >= 1 )    return ( 90.0 );  else if ( x <= -1 )    return ( -90.0 );  return ( Rad2Deg( asin( x ) ) );}/*! This function returns a boolean value which indicates whether the value   'ang' (from interval [-180..180] lies in the interval [angMin..angMax].    Examples: isAngInInterval( -100, 4, -150) returns false             isAngInInterval(   45, 4, -150) returns true    \param ang angle that should be checked    \param angMin minimum angle in interval    \param angMax maximum angle in interval    \return boolean indicating whether ang lies in [angMin..angMax] */bool isAngInInterval( AngDeg ang, AngDeg angMin, AngDeg angMax ){  // convert all angles to interval 0..360  if( ( ang    + 360 ) < 360 ) ang    += 360;  if( ( angMin + 360 ) < 360 ) angMin += 360;  if( ( angMax + 360 ) < 360 ) angMax += 360;  if( angMin < angMax ) // 0 ---false-- angMin ---true-----angMax---false--360    return angMin < ang && ang < angMax ;  else                  // 0 ---true--- angMax ---false----angMin---true---360    return !( angMax < ang && ang < angMin );}/*! This method returns the bisector (average) of two angles. It deals    with the boundary problem, thus when 'angMin' equals 170 and 'angMax'    equals -100, -145 is returned.    \param angMin minimum angle [-180,180]    \param angMax maximum angle [-180,180]    \return average of angMin and angMax. */AngDeg getBisectorTwoAngles( AngDeg angMin, AngDeg angMax ){  // separate sine and cosine part to circumvent boundary problem  return VecPosition::normalizeAngle(            atan2Deg( (sinDeg( angMin) + sinDeg( angMax ) )/2.0,                      (cosDeg( angMin) + cosDeg( angMax ) )/2.0 ) );}/*****************************************************************************//*******************   CLASS VECPOSITION   ***********************************//*****************************************************************************//*! Constructor for the VecPosition class. When the supplied    Coordinate System type equals CARTESIAN, the arguments x and y    denote the x- and y- and z-coordinates of the new position. When it    equals POLAR however, the arguments x and y and z denote the polar    coordinates of the new position; in this case x is thus equal to    the distance r from the origin and y is equal to the angle theta    that the polar vector makes with the x-axis and z is equal to angle phi.    \param x the x-coordinate of the new position when cs == CARTESIAN; the    distance of the new position from the origin when cs = POLAR    \param y the y-coordinate of the new position when cs = CARTESIAN; the    angle that the polar vector makes with the x-axis when cs = POLAR    \param z the z-coordinate of the new position when cs = CARTESIAN; the    angle that the polar vector makes with the z-axis when cs = POLAR    \param cs a CoordSystemT indicating whether x and y denote cartesian    coordinates or polar coordinates    \return the VecPosition corresponding to the given arguments */VecPosition::VecPosition( double x, double y, double z, CoordSystemT cs ){  setVecPosition( x, y, z, cs );}VecPosition VecPosition::cross( const VecPosition p ){    VecPosition ans (   getY() * p.getZ() - getZ() * p.getY(),                        getZ() * p.getX() - getX() * p.getZ(),                        getX() * p.getY() - getY() * p.getX());    return ans;}/*! Overloaded version of unary minus operator for VecPositions. It returns the    negative VecPosition, i.e. both the x- and y-coordinates are multiplied by    -1. The current VecPosition itself is left unchanged.    \return a negated version of the current VecPosition */VecPosition VecPosition::operator - ( ){  return ( VecPosition( -m_x, -m_y, -m_z ) );}/*! Overloaded version of the binary plus operator for adding a given double    value to a VecPosition. The double value is added to both the x- and    y-coordinates of the current VecPosition. The current VecPosition itself is    left unchanged.    \param d a double value which has to be added to the x- and    y- and z-coordinates of the current VecPosition    \return the result of adding the given double value to the current    VecPosition */VecPosition VecPosition::operator + ( const double &d ){  return ( VecPosition( m_x + d, m_y + d, m_z + d ) );}/*! Overloaded version of the binary plus operator for VecPositions. It returns    the sum of the current VecPosition and the given VecPosition by adding their    x- and y- and z-coordinates. The VecPositions themselves are left unchanged.    \param p a VecPosition    \return the sum of the current VecPosition and the given VecPosition */VecPosition VecPosition::operator + ( const VecPosition &p ){  return ( VecPosition( m_x + p.m_x, m_y + p.m_y, m_z + p.m_z ) );}/*! Overloaded version of the binary minus operator for subtracting a    given double value from a VecPosition. The double value is    subtracted from both the x- and y-coordinates of the current    VecPosition. The current VecPosition itself is left unchanged.    \param d a double value which has to be subtracted from the x- and    y- and z-coordinates of the current VecPosition    \return the result of subtracting the given double value from the current    VecPosition */VecPosition VecPosition::operator - ( const double &d ){  return ( VecPosition( m_x - d, m_y - d, m_z - d ) );}/*! Overloaded version of the binary minus operator for    VecPositions. It returns the difference between the current    VecPosition and the given VecPosition by subtracting their x- and    y-coordinates. The VecPositions themselves are left unchanged.    \param p a VecPosition    \return the difference between the current VecPosition and the given    VecPosition */VecPosition VecPosition::operator - ( const VecPosition &p ){  return ( VecPosition( m_x - p.m_x, m_y - p.m_y, m_z - p.m_z ) );}/*! Overloaded version of the multiplication operator for multiplying a    VecPosition by a given double value. Both the x- and y-coordinates of the    current VecPosition are multiplied by this value. The current VecPosition    itself is left unchanged.    \param d the multiplication factor    \return the result of multiplying the current VecPosition by the given    double value */VecPosition VecPosition::operator * ( const double &d  ){  return ( VecPosition( m_x * d, m_y * d, m_z * d ) );}/*! Overloaded version of the multiplication operator for    VecPositions. It returns the product of the current VecPosition    and the given VecPosition by multiplying their x- and    y- and z-coordinates. The VecPositions themselves are left unchanged.    \param p a VecPosition    \return the product of the current VecPosition and the given VecPosition */VecPosition VecPosition::operator * ( const VecPosition &p ){  return ( VecPosition( m_x * p.m_x, m_y * p.m_y, m_z * p.m_z ) );}/*! Overloaded version of the division operator for dividing a    VecPosition by a given double value. Both the x- and y-coordinates    of the current VecPosition are divided by this value. The current    VecPosition itself is left unchanged.    \param d the division factor    \return the result of dividing the current VecPosition by the given double    value */VecPosition VecPosition::operator / ( const double &d ){  return ( VecPosition( m_x / d, m_y / d, m_z / d  ) );}/*! Overloaded version of the division operator for VecPositions. It    returns the quotient of the current VecPosition and the given    VecPosition by dividing their x- and y- and z-coordinates. The    VecPositions themselves are left unchanged.    \param p a VecPosition    \return the quotient of the current VecPosition and the given one */VecPosition VecPosition::operator / ( const VecPosition &p ){  return ( VecPosition( m_x / p.m_x, m_y / p.m_y, m_z / p.m_z ) );}/*! Overloaded version of the assignment operator for assigning a given double    value to both the x- and y-coordinates of the current VecPosition. This    changes the current VecPosition itself.    \param d a double value which has to be assigned to both the x- and    y-coordinates of the current VecPosition */void VecPosition::operator = ( const double &d ){  m_x = d;  m_y = d;  m_z = d;}/*! Overloaded version of the sum-assignment operator for VecPositions. It    returns the sum of the current VecPosition and the given VecPosition by    adding their x- and y- and z- coordinates. This changes the current VecPosition    itself.    \param p a VecPosition which has to be added to the current VecPosition */void VecPosition::operator +=( const VecPosition &p ){  m_x += p.m_x;  m_y += p.m_y;  m_z += p.m_z;}/*! Overloaded version of the sum-assignment operator for adding a given double    value to a VecPosition. The double value is added to both the x- and    y-coordinates of the current VecPosition. This changes the current    VecPosition itself.    \param d a double value which has to be added to the x- and    y- and z-coordinates of the current VecPosition */void VecPosition::operator += ( const double &d ){  m_x += d;  m_y += d;  m_z += d;}/*! Overloaded version of the difference-assignment operator for    VecPositions.  It returns the difference between the current    VecPosition and the given VecPosition by subtracting their x- and    y-coordinates. This changes the current VecPosition itself.    \param p a VecPosition which has to be subtracted from the current    VecPosition */void VecPosition::operator -=( const VecPosition &p ){  m_x -= p.m_x;  m_y -= p.m_y;  m_z -= p.m_z;}/*! Overloaded version of the difference-assignment operator for    subtracting a given double value from a VecPosition. The double    value is subtracted from both the x- and y-coordinates of the    current VecPosition. This changes the current VecPosition itself.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -