/*
* Unit SGP_Math
* Author: Dr TS Kelso
* Original Version: 1991 Oct 30
* Current Revision: 1998 Mar 17
* Version: 3.00
* Copyright: 1991-1998, All Rights Reserved
*
* ported to C by: Neoklis Kyriazis April 9 2001
*/
#include "sgp4sdp4.h"
/* Returns sign of a double */
int
Sign(double arg)
{
if( arg > 0 )
return( 1 );
else if( arg < 0 )
return( -1 );
else
return( 0 );
} /* Function Sign*/
/*------------------------------------------------------------------*/
/* Returns square of a double */
double
Sqr(double arg)
{
return( arg*arg );
} /* Function Sqr */
/*------------------------------------------------------------------*/
/* Returns cube of a double */
double
Cube(double arg)
{
return( arg*arg*arg );
} /*Function Cube*/
/*------------------------------------------------------------------*/
/* Returns angle in radians from arg id degrees */
double
Radians(double arg)
{
return( arg*de2ra );
} /*Function Radians*/
/*------------------------------------------------------------------*/
/* Returns angle in degrees from arg in rads */
double
Degrees(double arg)
{
return( arg/de2ra );
} /*Function Degrees*/
/*------------------------------------------------------------------*/
/* Returns the arcsine of the argument */
double
ArcSin(double arg)
{
if( fabs(arg) >= 1 )
return( Sign(arg)*pio2 );
else
return( atan(arg/sqrt(1-arg*arg)) );
} /*Function ArcSin*/
/*------------------------------------------------------------------*/
/* Returns orccosine of rgument */
double
ArcCos(double arg)
{
return( pio2 - ArcSin(arg) );
} /*Function ArcCos*/
/*------------------------------------------------------------------*/
/* Calculates scalar magnitude of a vector_t argument */
void
Magnitude(vector_t *v)
{
v->w = sqrt(Sqr(v->x) + Sqr(v->y) + Sqr(v->z));
} /*Procedure Magnitude*/
/*------------------------------------------------------------------*/
/* Adds vectors v1 and v2 together to produce v3 */
void
Vec_Add(vector_t *v1, vector_t *v2, vector_t *v3)
{
v3->x = v1->x + v2->x;
v3->y = v1->y + v2->y;
v3->z = v1->z + v2->z;
Magnitude(v3);
} /*Procedure Vec_Add*/
/*------------------------------------------------------------------*/
/* Subtracts vector v2 from v1 to produce v3 */
void
Vec_Sub(vector_t *v1, vector_t *v2, vector_t *v3)
{
v3->x = v1->x - v2->x;
v3->y = v1->y - v2->y;
v3->z = v1->z - v2->z;
Magnitude(v3);
} /*Procedure Vec_Sub*/
/*------------------------------------------------------------------*/
/* Multiplies the vector v1 by the scalar k to produce the vector v2 */
void
Scalar_Multiply(double k, vector_t *v1, vector_t *v2)
{
v2->x = k * v1->x;
v2->y = k * v1->y;
v2->z = k * v1->z;
v2->w = fabs(k) * v1->w;
} /*Procedure Scalar_Multiply*/
/*------------------------------------------------------------------*/
/* Multiplies the vector v1 by the scalar k */
void
Scale_Vector(double k, vector_t *v)
{
v->x *= k;
v->y *= k;
v->z *= k;
Magnitude(v);
} /* Procedure Scale_Vector */
/*------------------------------------------------------------------*/
/* Returns the dot product of two vectors */
double
Dot(vector_t *v1, vector_t *v2)
{
return( v1->x*v2->x + v1->y*v2->y + v1->z*v2->z );
} /*Function Dot*/
/*------------------------------------------------------------------*/
/* Calculates the angle between vectors v1 and v2 */
double
Angle(vector_t *v1, vector_t *v2)
{
Magnitude(v1);
Magnitude(v2);
return( ArcCos(Dot(v1,v2)/(v1->w*v2->w)) );
} /*Function Angle*/
/*------------------------------------------------------------------*/
/* Produces cross product of v1 and v2, and returns in v3 */
void
Cross(vector_t *v1, vector_t *v2 ,vector_t *v3)
{
v3->x = v1->y*v2->z - v1->z*v2->y;
v3->y = v1->z*v2->x - v1->x*v2->z;
v3->z = v1->x*v2->y - v1->y*v2->x;
Magnitude(v3);
} /*Procedure Cross*/
/*------------------------------------------------------------------*/
/* Normalizes a vector */
void
Normalize( vector_t *v )
{
v->x /= v->w;
v->y /= v->w;
v->z /= v->w;
} /*Procedure Normalize*/
/*------------------------------------------------------------------*/
/* Four-quadrant arctan function */
double
AcTan(double sinx, double cosx)
{
if(cosx == 0)
{
if(sinx > 0)
return (pio2);
else
return (x3pio2);
}
else
{
if(cosx > 0)
{
if(sinx > 0)
return ( atan(sinx/cosx) );
else
return ( twopi + atan(sinx/cosx) );
}
else
return ( pi + atan(sinx/cosx) );
}
} /* Function AcTan */
/*------------------------------------------------------------------*/
/* Returns mod 2pi of argument */
double
FMod2p(double x)
{
int i;
double ret_val;
ret_val = x;
i = ret_val/twopi;
ret_val -= i*twopi;
if (ret_val < 0) ret_val += twopi;
return (ret_val);
} /* fmod2p */
/*------------------------------------------------------------------*/
/* Returns arg1 mod arg2 */
double
Modulus(double arg1, double arg2)
{
int i;
double ret_val;
ret_val = arg1;
i = ret_val/arg2;
ret_val -= i*arg2;
if (ret_val < 0) ret_val += arg2;
return (ret_val);
} /* modulus */
/*------------------------------------------------------------------*/
/* Returns fractional part of double argument */
double
Frac( double arg )
{
return( arg - floor(arg) );
} /* Frac */
/*------------------------------------------------------------------*/
/* Returns argument rounded up to nearest integer */
int
Round( double arg )
{
return( (int) floor(arg + 0.5) );
} /* Round */
/*------------------------------------------------------------------*/
/* Returns the floor integer of a double arguement, as double */
double
Int( double arg )
{
return( floor(arg) );
} /* Int */
/*------------------------------------------------------------------*/
/* Converts the satellite's position and velocity */
/* vectors from normalised values to km and km/sec */
void
Convert_Sat_State( vector_t *pos, vector_t *vel )
{
Scale_Vector( xkmper, pos );
Scale_Vector( xkmper*xmnpda/secday, vel );
} /* Procedure Convert_Sat_State */
/*------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1