Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.apo.nmsu.edu/Telescopes/coordConv/html/coord_sys_8cc_source.html
Дата изменения: Thu May 7 21:42:46 2015
Дата индексирования: Sun Apr 10 03:37:35 2016
Кодировка:

Поисковые слова: п п п п п п п п
lsst.coordConv: src/coordSys.cc Source File
lsst.coordConv  unknown
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
coordSys.cc
Go to the documentation of this file.
1 #include <sstream>
2 #include <stdexcept>
3 #include <vector>
4 #include "boost/make_shared.hpp"
5 #include "coordConv/coordSys.h"
6 
7 namespace coordConv {
8 
9  void CoordSys::setCurrDate(double date) const {
10  if (!isCurrent()) {
11  throw std::runtime_error("Cannot set current date; coordSys is not current");
12  } else if (date <= 0) {
13  throw std::runtime_error("date must be > 0");
14  }
15  _setDate(date);
16  }
17 
18  Coord CoordSys::convertFrom(CoordSys const &fromCoordSys, Coord const &fromCoord, Site const &site, double tai) const {
19  if (isCurrent()) {
21  };
22  if (fromCoordSys.isCurrent()) {
23  fromCoordSys.setCurrDate(fromCoordSys.dateFromTAI(tai));
24  };
25  Coord icrsCoord = fromCoordSys.toFK5J2000(fromCoord, site);
26  return fromFK5J2000(icrsCoord, site);
27  }
28 
29  PVTCoord CoordSys::convertFrom(CoordSys const &fromCoordSys, PVTCoord const &fromPVTCoord, Site const &site) const {
30  std::vector<Coord> coordArr;
31  double const tai = fromPVTCoord.getTAI();
32  for (int i = 0; i < 2; ++i) {
33  double evalTAI = tai + (i * DeltaTForPos);
34  coordArr.push_back(convertFrom(fromCoordSys, fromPVTCoord.getCoord(evalTAI), site, evalTAI));
35  }
36  return PVTCoord(coordArr[0], coordArr[1], tai, DeltaTForPos);
37  }
38 
39  Coord CoordSys::convertFrom(double &toDir, double &scaleChange, CoordSys const &fromCoordSys, Coord const &fromCoord, double fromDir, Site const &site, double tai) const {
40  double const OffsetLength = 1e-3;
41  Coord toCoord = convertFrom(fromCoordSys, fromCoord, site, tai);
42  double dumDir;
43  Coord offFromCoord = fromCoord.offset(dumDir, fromDir, OffsetLength);
44  Coord offToCoord = convertFrom(fromCoordSys, offFromCoord, site, tai);
45  scaleChange = toCoord.angularSeparation(offToCoord) / OffsetLength;
46  toDir = toCoord.orientationTo(offToCoord);
47  return toCoord;
48  }
49 
50  PVTCoord CoordSys::convertFrom(PVT &toDir, double &scaleChange, CoordSys const &fromCoordSys, PVTCoord const &fromPVTCoord, PVT const &fromDir, Site const &site) const {
51  std::vector<Coord> coordArr;
52  double toDirPair[2], scaleChangePair[2];
53  double const tai = fromPVTCoord.getTAI();
54  for (int i = 0; i < 2; ++i) {
55  double evalTAI = tai + (i * DeltaTForPos);
56  coordArr.push_back(convertFrom(toDirPair[i], scaleChangePair[i],
57  fromCoordSys, fromPVTCoord.getCoord(evalTAI), fromDir.getPos(evalTAI), site, evalTAI));
58  }
59  scaleChange = scaleChangePair[0];
60  toDir.setFromPair(toDirPair, tai, DeltaTForPos, true);
61  return PVTCoord(coordArr[0], coordArr[1], tai, DeltaTForPos);
62  }
63 
65  std::vector<Coord> coordArr;
66  double const tai = pvtCoord.getTAI();
67  for (int i = 0; i < 2; ++i) {
68  double evalTAI = tai + (i * DeltaTForPos);
69  coordArr.push_back(removePM(pvtCoord.getCoord(evalTAI), evalTAI));
70  }
71  return PVTCoord(coordArr[0], coordArr[1], tai, DeltaTForPos);
72  }
73 
74  CoordSys::Ptr makeCoordSys(std::string const &name, double date) {
75  if (name == "icrs") {
76  return boost::make_shared<coordConv::ICRSCoordSys>(date);
77  } else if (name == "fk5") {
78  return boost::make_shared<coordConv::FK5CoordSys>(date);
79  } else if (name == "fk4") {
80  return boost::make_shared<coordConv::FK4CoordSys>(date);
81  } else if (name == "gal") {
82  return boost::make_shared<coordConv::GalCoordSys>(date);
83  } else if (name == "appgeo") {
84  return boost::make_shared<coordConv::AppGeoCoordSys>(date);
85  } else if (name == "apptopo") {
86  return boost::make_shared<coordConv::AppTopoCoordSys>(date);
87  } else if (name == "obs") {
88  return boost::make_shared<coordConv::ObsCoordSys>(date);
89  } else if (name == "none") {
90  return boost::make_shared<coordConv::NoneCoordSys>(date);
91  } else {
92  std::ostringstream os;
93  os << "Unknown coordinate system name: " << name;
94  throw std::invalid_argument(os.str());
95  }
96  }
97 
98  std::ostream &operator<<(std::ostream &os, CoordSys const &coordSys) {
99  // use overloaded __repr__
100  os << coordSys.__repr__();
101  return os;
102  }
103 
104 }
virtual Coord removePM(Coord const &coord, double tai) const =0
const double DeltaTForPos
by computing position at two nearby times (sec)
Definition: coordSys.h:15
virtual std::string __repr__() const =0
double angularSeparation(Coord const &coord) const
Definition: coord.cc:150
void setCurrDate(double date) const
Definition: coordSys.cc:9
virtual Coord fromFK5J2000(Coord const &coord, Site const &site) const =0
double getTAI() const
Definition: pvtCoord.h:90
virtual void _setDate(double date) const
Definition: coordSys.h:246
bool isCurrent() const
Definition: coordSys.h:77
boost::shared_ptr< CoordSys > Ptr
Definition: coordSys.h:32
void setFromPair(double const posPair[2], double t, double deltaT, bool isAngle)
Definition: pvt.h:175
virtual Coord convertFrom(CoordSys const &fromCoordSys, Coord const &fromCoord, Site const &site, double tai=0) const
Definition: coordSys.cc:18
virtual double dateFromTAI(double tai) const =0
CoordSys::Ptr makeCoordSys(std::string const &name, double date)
Definition: coordSys.cc:74
Coord offset(double &toOrient, double fromOrient, double dist) const
Definition: coord.cc:172
double getPos(double t) const
Return the position at the specified time; return NaN if unknown.
Definition: pvt.h:57
virtual Coord toFK5J2000(Coord const &coord, Site const &site) const =0
Coord getCoord() const
Definition: pvtCoord.h:95
double orientationTo(Coord const &coord) const
Definition: coord.cc:156
std::ostream & operator<<(std::ostream &out, Coord const &coord)
Definition: coord.cc:263