![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /********************************************************************* 00002 ** Copyright (c) 2003 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 /********************************************************************* 00006 ** $RCSfile: DtCoordinateSystem.h,v $ $Revision: 1.14 $ $State: Exp $ 00007 *********************************************************************/ 00008 00011 00012 #pragma once 00013 #include <vrvUtil/vrvUtil.h> 00014 #include <vrvUtil/DtUnicode.h> 00015 #include <makArchives/DtDisplayUnitsSettingsRecord.h> 00016 #include <matrix/vlVector.h> 00017 #include <boost/unordered_map.hpp> 00018 #include <string> 00019 00020 class DtMapDatum; 00021 class DtTaitBryan; 00022 class DtDcm; 00023 00024 namespace makVrv 00025 { 00026 00027 class DtNoOpCoordinateConverter; 00028 class DtFlatEarthCoordinateConverter; 00029 class DtGeocentricCoordinateConverter; 00030 class DtUtmCoordinateConverter; 00031 class DtCartesianCoordinateConverter; 00032 class DtLambertCoordinateConverter; 00033 class DtCoordinateConverterFactory; 00034 class DtCoordinateConverter; 00035 00036 class DtCoordinateDisplay; 00037 class DtCoordinateDisplayCollection; 00038 class DtUnitConverterCollection; 00039 00043 class DT_DLL_VRVUTIL DtCoordinateSystem 00044 { 00045 public: 00046 00047 typedef DtCoordinateSystem* (*CoordinateSystemCreatorFn)(); 00048 typedef DtCoordinateSystem* (*CoordinateSystemCloneFn)(const DtCoordinateSystem&); 00049 typedef void (*TypeChangedFn)(DtCoordinateSystem*, void*); 00050 00052 static DtCoordinateSystem* create(); 00053 00055 DtCoordinateSystem* clone() const; 00056 00058 ~DtCoordinateSystem(); 00059 00062 const std::string& type() const; 00063 00067 bool isGeocentric() const; 00068 00070 const std::string& parameters() const; 00071 00074 bool set(const std::string& type, const std::string& origin); 00075 00079 bool addConverter(const std::string& t, DtCoordinateConverter* converter); 00080 00082 DtCoordinateConverter* converter() const; 00083 00085 DtCoordinateConverter* converter(const std::string& type) const; 00086 00088 virtual DtCoordinateDisplay* display( 00089 makArchives::DtDisplayUnitsSettingsRecord::CoordSys system ) const; 00090 00091 virtual DtCoordinateDisplay* display( 00092 const DtUnicode& coordSysName ) const; 00093 00095 virtual DtCoordinateDisplayCollection& displays(); 00096 virtual const DtCoordinateDisplayCollection& displays() const; 00097 00099 virtual DtUnitConverterCollection& units(); 00100 virtual const DtUnitConverterCollection& units() const; 00101 00103 DtNoOpCoordinateConverter* noopConverter(); 00104 const DtNoOpCoordinateConverter* noopConverter() const; 00105 00107 DtUtmCoordinateConverter* utmConverter() ; 00108 const DtUtmCoordinateConverter* utmConverter() const; 00109 00111 DtLambertCoordinateConverter* lambertConverter() ; 00112 const DtLambertCoordinateConverter* lambertConverter() const; 00113 00115 DtCartesianCoordinateConverter* cartesianConverter() ; 00116 const DtCartesianCoordinateConverter* cartesianConverter() const; 00117 00119 DtGeocentricCoordinateConverter* geocentricConverter() ; 00120 const DtGeocentricCoordinateConverter* geocentricConverter() const; 00121 00123 DtFlatEarthCoordinateConverter* flatEarthConverter() ; 00124 const DtFlatEarthCoordinateConverter* flatEarthConverter() const; 00125 00127 const DtMapDatum& datum() const; 00128 00132 void setDatum(const DtMapDatum& datum); 00133 00136 void netToLocalPos(const DtVector& netpos, DtVector& localpos) const; 00137 void netToLocalVec(const DtVector& localpos, const DtVector& netvec, DtVector& localvec) const; 00138 void netToLocalOri(const DtVector& localpos, const DtTaitBryan& netori, DtTaitBryan& localori) const; 00139 void netToLocalHpr(const DtVector& localpos, const DtTaitBryan& netori, DtTaitBryan& localhpr) const; 00140 void netBodyToLocalBody(const DtVector& localpos, const DtDcm& netdcm, DtDcm& localdcm) const; 00141 00142 00144 /* FIXME: This function does not work 00145 inline void netToLocalPos(const double netpos[3], double localpos[3]) const 00146 { 00147 DtVector localpos_v; 00148 DtVector netpos_v; 00149 memcpy(&netpos_v,netpos,sizeof(netpos)); 00150 netToLocalPos( netpos_v, localpos_v); 00151 memcpy(localpos,&localpos_v,sizeof(localpos)); 00152 }*/ 00153 00155 void netToLocalOri(const double localpos[3], const double netori[3], double localori[3]) const; 00156 00159 void localToNetPos( const DtVector& localpos, DtVector& netpos) const; 00160 void localToNetOri(const DtVector& localpos, const DtTaitBryan& localori, DtTaitBryan& netori) const; 00161 void localToNetVec(const DtVector& localpos, const DtVector& localvec, DtVector& netvec) const; 00162 00164 inline void localToNetPos( const double (&localpos)[3], double (&netpos)[3]) const 00165 { 00166 DtVector localpos_v; 00167 memcpy(&localpos_v,localpos,sizeof(localpos)); 00168 DtVector netpos_v; 00169 localToNetPos( localpos_v, netpos_v); 00170 memcpy(netpos,&netpos_v,sizeof(netpos)); 00171 } 00172 00174 void localToNetOri(const double localpos[3], const double localori[3], double netori[3]) const; 00175 00176 public: 00177 00179 static DtCoordinateConverterFactory& converterFactory(); 00180 00184 static void setCreator(CoordinateSystemCreatorFn fn); 00185 00186 protected: 00187 00189 DtCoordinateSystem(); 00190 00192 DtCoordinateSystem(const DtCoordinateSystem&); 00193 00194 private: 00195 00197 DtCoordinateSystem& operator=(const DtCoordinateSystem&); 00198 00199 protected: 00200 00201 typedef boost::unordered_map<std::string, DtCoordinateConverter*> ConverterMap; 00202 00203 ConverterMap myConverters; 00204 DtCoordinateConverter* myCurrentConverter; 00205 DtMapDatum* myCurrentDatum; 00206 std::string myCoordinateSystemParameters; 00207 00208 DtCoordinateDisplayCollection* myDisplays; 00209 DtUnitConverterCollection* myUnits; 00210 00211 protected: 00212 00213 static CoordinateSystemCreatorFn theCreatorFn; 00214 static CoordinateSystemCloneFn theCloneFn; 00215 static DtCoordinateConverterFactory theCoordConverterFactory; 00216 00217 00218 00219 }; 00220 00221 }