Changeset 2063 in ntrip for trunk/BNC/bncutils.cpp


Ignore:
Timestamp:
Dec 1, 2009, 1:54:49 PM (14 years ago)
Author:
mervart
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/bncutils.cpp

    r2043 r2063  
    185185  xyz = RR * rsw;
    186186}
     187
     188// Rectangular Coordinates -> Ellipsoidal Coordinates
     189////////////////////////////////////////////////////////////////////////////
     190t_irc xyz2ell(const double* XYZ, double* Ell) {
     191
     192  const double bell = t_CST::aell*(1.0-1.0/t_CST::fInv) ;
     193  const double e2   = (t_CST::aell*t_CST::aell-bell*bell)/(t_CST::aell*t_CST::aell) ;
     194  const double e2c  = (t_CST::aell*t_CST::aell-bell*bell)/(bell*bell) ;
     195 
     196  double nn, ss, zps, hOld, phiOld, theta, sin3, cos3;
     197
     198  ss    = sqrt(XYZ[0]*XYZ[0]+XYZ[1]*XYZ[1]) ;
     199  zps   = XYZ[2]/ss ;
     200  theta = atan( (XYZ[2]*t_CST::aell) / (ss*bell) );
     201  sin3  = sin(theta) * sin(theta) * sin(theta);
     202  cos3  = cos(theta) * cos(theta) * cos(theta);
     203
     204  // Closed formula
     205  Ell[0] = atan( (XYZ[2] + e2c * bell * sin3) / (ss - e2 * t_CST::aell * cos3) ); 
     206  Ell[1] = atan2(XYZ[1],XYZ[0]) ;
     207  nn = t_CST::aell/sqrt(1.0-e2*sin(Ell[0])*sin(Ell[0])) ;
     208  Ell[2] = ss / cos(Ell[0]) - nn;
     209
     210  const int MAXITER = 100;
     211  for (int ii = 1; ii <= MAXITER; ii++) {
     212    nn     = t_CST::aell/sqrt(1.0-e2*sin(Ell[0])*sin(Ell[0])) ;
     213    hOld   = Ell[2] ;
     214    phiOld = Ell[0] ;
     215    Ell[2] = ss/cos(Ell[0])-nn ;
     216    Ell[0] = atan(zps/(1.0-e2*nn/(nn+Ell[2]))) ;
     217    if ( fabs(phiOld-Ell[0]) <= 1.0e-11 && fabs(hOld-Ell[2]) <= 1.0e-5 ) {
     218      return success;
     219    }
     220  }
     221
     222  return failure;
     223}
Note: See TracChangeset for help on using the changeset viewer.