# Rotation Notations

I was writing some code to perform some celestial calculations.  A lot of it handled changes in positions from certain rotations (orbits, revolutions).  There are also instances where time is treated as a rotation (ex: 1 hour of rotation is 15 degrees).  The best notation for the rotation depends on what is being done.  Here are the rotation notations that might be used.

• Degrees
• Decimal Degrees
• Degrees, Minutes, Seconds
• Hours
• Decimal Hours
• Hours, Minutes, Seconds

Conversion from one to another is easy.  What I did find challenging is ensuring that the right conversion had been performed before working with it.  The trig functions expect to always receive radians.  More than once I made the mistake of converting to the wrong unit before performing a calculation.  Rather then continue forward on a path that has many opportunities for mistakes I made a single class to represent rotations that can be used in various scenarios.  It will always internally represent rotations in degrees.  If I want to explicitly convert the class to a specific type there are methods to explicitly convert to any of the other rotation types.

Instances of this custom type also can be assigned a preferred notation. This preferred notation is used when printing it to the output stream. This allows a preferred format to be assigned without risking making any conversion mistakes.

The interface for the class and the support class follows.

```#include <stdio.h>
#include <cmath>
#include <iostream>

typedef double Degree;
typedef double  Hour;
typedef double Minute;
typedef double Second;

enum RotationNotation {
NOTATION_DEGREES,
NOTATION_DMS,
NOTATION_HOURS,
NOTATION_HMS,
};

class Rotation;

struct HMS {
Hour H;
Minute M;
Second S;
};

struct DMS {
Degree D;
Minute M;
Second S;
} ;

std::ostream& operator << (std::ostream& o, const HMS& h);
std::ostream& operator << (std::ostream& o, const DMS& d);
std::ostream& operator << (std::ostream& o, const Rotation a);

double sin(const Rotation& source);
double cos(const Rotation& source);

Hour HMSToHour(const HMS& hms);
Hour DMSToHour(const DMS&);
Hour DegToHour(const Degree degrees);

DMS DegToDMS(const Degree degrees);
DMS HourToDMS(const Hour hour);
DMS HMSToDMS(const HMS&);

HMS DegToHMS(const Degree degrees);
HMS DMSToHMS(const DMS&);
HMS HourToHMS(const Hour);

Degree DMSToDeg(const DMS& );
Degree HMSToDeg(const HMS&);
Degree HourToDeg(const Hour hour);

class Rotation {
private:
Degree _degrees;
RotationNotation _notation;
public:
Rotation();
Rotation(const Rotation& source);

RotationNotation getNotation() const;
void setNotation(RotationNotation);

const Degree getDegrees() const;
const Hour getHours() const ;
const DMS getDMS() const ;
const HMS getHMS() const ;

void setDegrees(const Degree degree) ;
void setHours(const Hour hour)  ;