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.
- Radians
- 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;
typedef double Radian;
enum RotationNotation {
NOTATION_DEGREES,
NOTATION_DMS,
NOTATION_HOURS,
NOTATION_HMS,
NOTATION_RADIANS
};
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 RadToHour(const Radian );
Hour HMSToHour(const HMS& hms);
Hour DMSToHour(const DMS&);
Hour DegToHour(const Degree degrees);
DMS RadToDMS(const Radian);
DMS DegToDMS(const Degree degrees);
DMS HourToDMS(const Hour hour);
DMS HMSToDMS(const HMS&);
HMS RadToHMS(const Radian);
HMS DegToHMS(const Degree degrees);
HMS DMSToHMS(const DMS&);
HMS HourToHMS(const Hour);
Degree RadToDeg(const Radian);
Degree DMSToDeg(const DMS& );
Degree HMSToDeg(const HMS&);
Degree HourToDeg(const Hour hour);
Radian HourToRad(const Hour);
Radian HMSToRad(const HMS& );
Radian DMSToRad(const DMS& );
Radian DegToRad(const Degree);
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 Minute getRadians() const ;
const DMS getDMS() const ;
const HMS getHMS() const ;
void setDegrees(const Degree degree) ;
void setHours(const Hour hour) ;
void setRadians(const Radian rad) ;
void setDMS(const DMS& dms) ;
void setHMS(const HMS& hms) ;
};
Download Code 2.0 KB
-30-