INDI Alignment Layer  0.0
AlignmentDatabase.h
00001 #ifndef ALIGNMENTDATABASE_H
00002 #define ALIGNMENTDATABASE_H
00003 
00004 #include <vector>
00005 #include "Wm5ConvexHull3.h"
00006 #include "Wm5Triangle3.h"
00007 #include "Wm5Matrix3.h"
00008 
00017 class CAlignmentDatabase
00018 {
00019 public:
00033     typedef enum { HOURS_DEGREES, DEGREES_DEGREES, RADIANS_RADIANS} CoordinateSystemUnits;
00034 
00036     CAlignmentDatabase();
00038     virtual ~CAlignmentDatabase();
00039 
00042     void SetLowerCoordinateSystemUnits(CoordinateSystemUnits Units) { LowerCoordinateSystemUnits = Units; }
00043 
00053     bool AddAlignmentPoint(const double ReferenceTime, const double RightAscension, const double Declination, const double Axis1, const double Axis2, bool Recalculate = false);
00054 
00066     bool RecalculateDatabase();
00067 
00075     bool TransformUpperToLower(const double RightAscension, const double Declination, double& Axis1, double& Axis2);
00076 
00084     bool TransformLowerToUpper(const double Axis1, const double Axis2, double& RightAscension, double& Declination);
00085 
00090     bool Save(const std::string& Filename);
00091 
00096     bool Load(const std::string& Filename);
00097 
00102     bool Append(const std::string& Filename);
00103 
00104 protected:
00105 private:
00106     static const double Epsilon = 0.0000001; // An arbitrary guess
00112     struct AlignmentPoint
00113     {
00114         AlignmentPoint(double ReferenceTime, double RightAscension, double Declination, double Axis1, double Axis2) :
00115                         ReferenceTime(ReferenceTime),
00116                         RightAscension(RightAscension),
00117                         Declination(Declination),
00118                         Axis1(Axis1),
00119                         Axis2(Axis2) {}
00120         // All angles are in radians
00121         double ReferenceTime;
00122         double RightAscension;
00123         double Declination;
00124         double Axis1;
00125         double Axis2;
00126     };
00127 
00128     std::vector<AlignmentPoint> AlignmentPoints;
00129 
00130     struct TinFacet
00131     {
00132         Wm5::Triangle3d Facet;
00133         Wm5::Matrix3d TransformationMatrix;
00134     };
00135     typedef std::vector<TinFacet> TinFacets;
00136 
00137     TinFacets UpperLayerTinFacets;
00138     TinFacets LowerLayerTinFacets;
00139 
00140     CoordinateSystemUnits LowerCoordinateSystemUnits;
00141 
00142     double RightAscensionToDummyHourAngle(const double RightAscension, const double ReferenceTime);
00143     double DummyHourAngleToRightAscension(const double DummyHourAngle, const double ReferenceTime);
00144     Wm5::Vector3d MakeUpperDirectionCosine(const double RightAscension, const double Declination, const double ReferenceTime);
00145     Wm5::Vector3d MakeLowerDirectionCosine(const double Axis1, const double Axis2, const double ReferenceTime);
00146     const double UTCNow();
00147 
00148     typedef enum { UPPER_TO_LOWER, LOWER_TO_UPPER} Direction;
00149     const Wm5::Matrix3d FindTransformationmatrix(const Wm5::Vector3d DirectionCosine, Direction Direction);
00150 };
00151 
00152 
00153 #endif // ALIGNMENTDATABASE_H