00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "trafos.h"
00033 #include "geom_utils.h"
00034 #include "lsconstants.h"
00035
00036 using namespace std;
00037
00038 vec3 Trafo::xcc_dp_precess (const vec3 &iv, double iepoch,
00039 double oepoch)
00040 {
00041
00042 double Tm = ((oepoch+iepoch)*0.5 - 1900.) *0.01;
00043 double gp_long = degr2rad * ((oepoch-iepoch) * (50.2564+0.0222*Tm) / 3600.);
00044 double obl_long =
00045 degr2rad * (180. - (173. + (57.06+54.77*Tm) / 60.)) + gp_long*0.5;
00046 double dco = cos(obl_long), dso = sin(obl_long);
00047 vec3 ov (iv.x*dco-iv.y*dso, iv.x*dso+iv.y*dco, iv.z);
00048
00049
00050 double dE = degr2rad * ((oepoch-iepoch) * (0.4711-0.0007*Tm) / 3600.);
00051 double dce = cos(dE), dse = sin(dE);
00052 double temp = ov.y*dce - ov.z*dse;
00053 ov.z = ov.y*dse + ov.z*dce;
00054 ov.y = temp;
00055
00056
00057 double dL = gp_long - obl_long;
00058 double dcl = cos(dL), dsl = sin(dL);
00059 temp = ov.x*dcl - ov.y*dsl;
00060 ov.y = ov.x*dsl + ov.y*dcl;
00061 ov.x = temp;
00062
00063 return ov;
00064 }
00065
00066 double Trafo::get_epsilon (double epoch)
00067 {
00068 double T = (epoch - 1900.) * 0.01;
00069 return
00070 degr2rad * (23.452294 - 0.0130125*T - 1.63889e-6*T*T + 5.02778e-7*T*T*T);
00071 }
00072
00073
00074
00075
00076 vec3 Trafo::xcc_dp_e_to_q (const vec3 &iv, double epoch)
00077 {
00078 double epsilon=get_epsilon(epoch);
00079 double dc = cos(epsilon), ds = sin(epsilon);
00080 return vec3 (iv.x, dc*iv.y-ds*iv.z, dc*iv.z+ds*iv.y);
00081 }
00082
00083 vec3 Trafo::xcc_dp_q_to_e (const vec3 &iv, double epoch)
00084 {
00085 double epsilon=-get_epsilon(epoch);
00086 double dc = cos(epsilon), ds = sin(epsilon);
00087 return vec3 (iv.x, dc*iv.y-ds*iv.z, dc*iv.z+ds*iv.y);
00088 }
00089
00090
00091
00092
00093 vec3 Trafo::xcc_dp_g_to_e (const vec3 &iv, double epoch)
00094 {
00095 static const rotmatrix T (-0.054882486, 0.494116468, -0.867661702,
00096 -0.993821033, -0.110993846, -0.000346354,
00097 -0.096476249, 0.862281440, 0.497154957);
00098 vec3 hv=T.Transform(iv);
00099
00100 if (!approx(epoch,2000.))
00101 hv=xcc_dp_precess(hv,2000.,epoch);
00102
00103 return hv;
00104 }
00105
00106
00107
00108
00109 vec3 Trafo::xcc_dp_e_to_g (const vec3 &iv, double epoch)
00110 {
00111 static const rotmatrix T (-0.054882486, -0.993821033, -0.096476249,
00112 0.494116468, -0.110993846, 0.862281440,
00113 -0.867661702, -0.000346354, 0.497154957);
00114 vec3 hv=iv;
00115 if (!approx(epoch,2000.))
00116 hv=xcc_dp_precess(hv,epoch,2000.);
00117
00118 return T.Transform(hv);
00119 }
00120
00121
00122
00123 vec3 Trafo::xcc_v_convert(const vec3 &iv, double iepoch, double oepoch,
00124 coordsys isys,coordsys osys)
00125 {
00126 vec3 xv;
00127 if (isys == Ecliptic)
00128 xv=iv;
00129 else if (isys == Equatorial)
00130 xv = xcc_dp_q_to_e(iv,iepoch);
00131 else if (isys == Galactic)
00132 xv = xcc_dp_g_to_e(iv,iepoch);
00133 else
00134 planck_fail("Unsupported input coordinate system");
00135
00136 vec3 yv = approx(iepoch,oepoch) ? xv : xcc_dp_precess(xv,iepoch,oepoch);
00137
00138 vec3 ov;
00139 if (osys == Ecliptic)
00140 ov = yv;
00141 else if (osys == Equatorial)
00142 ov = xcc_dp_e_to_q(yv,oepoch);
00143 else if (osys == Galactic)
00144 ov = xcc_dp_e_to_g(yv,oepoch);
00145 else
00146 planck_fail("Unsupported output coordinate system");
00147
00148 return ov;
00149 }
00150
00151 void Trafo::coordsys2matrix (double iepoch, double oepoch,
00152 coordsys isys, coordsys osys, rotmatrix &matrix)
00153 {
00154 vec3 v1p = xcc_v_convert(vec3(1,0,0),iepoch,oepoch,isys,osys),
00155 v2p = xcc_v_convert(vec3(0,1,0),iepoch,oepoch,isys,osys),
00156 v3p = xcc_v_convert(vec3(0,0,1),iepoch,oepoch,isys,osys);
00157 v1p.Normalize(); v2p.Normalize(); v3p.Normalize();
00158 matrix=rotmatrix(v1p,v2p,v3p);
00159 }
00160
00161 Trafo::Trafo (double iepoch, double oepoch, coordsys isys, coordsys osys)
00162 { coordsys2matrix (iepoch, oepoch, isys, osys, mat); }
00163
00164 pointing Trafo::operator() (const pointing &ptg) const
00165 { return pointing(operator()(vec3(ptg))); }
00166
00167 void Trafo::rotatefull (const pointing &ptg, pointing &newptg,
00168 double &delta_psi) const
00169 {
00170 vec3 vec (ptg);
00171 vec3 east (-vec.y,vec.x,0.);
00172 vec3 newvec = operator()(vec);
00173 vec3 neweast = operator()(east);
00174 delta_psi = orientation(newvec,neweast)+halfpi;
00175 newptg = newvec;
00176 }
00177
00178 void Trafo::rotatefull (pointing &ptg, double &psi) const
00179 {
00180 vec3 vec (ptg);
00181 vec3 east (-vec.y,vec.x,0.);
00182 vec3 newvec = operator()(vec);
00183 vec3 neweast = operator()(east);
00184 psi += orientation(newvec,neweast)+halfpi;
00185 ptg = newvec;
00186 }
00187
00188 void Trafo::rotatefull (const vec3 &vec, vec3 &newvec, double &delta_psi) const
00189 {
00190 vec3 east (-vec.y,vec.x,0.);
00191 newvec = operator()(vec);
00192 vec3 neweast = operator()(east);
00193 delta_psi = orientation(newvec,neweast)+halfpi;
00194 }
00195
00196 void Trafo::rotatefull (vec3 &vec, double &psi) const
00197 {
00198 vec3 east (-vec.y,vec.x,0.);
00199 vec3 newvec = operator()(vec);
00200 vec3 neweast = operator()(east);
00201 psi += orientation(newvec,neweast)+halfpi;
00202 vec = newvec;
00203 }