File: ellipsoid.cpp

package info (click to toggle)
groops 0%2Bgit20250907%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 11,140 kB
  • sloc: cpp: 135,607; fortran: 1,603; makefile: 20
file content (58 lines) | stat: -rw-r--r-- 1,647 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/***********************************************/
/**
* @file ellipsoid.cpp
*
* @brief Transformation of ellipsoidial coordinates.
*
* @author Torsten Mayer-Guerr
* @date 2004-10-25
*
*/
/***********************************************/

#include "base/importStd.h"
#include "base/ellipsoid.h"

/***********************************************/

void Ellipsoid::operator()(const Vector3d &point, Angle &L, Angle &B, Double &h) const
{
  if(point.quadsum() == 0.)
    throw(Exception("In Ellipsoid:\n0 Vector"));

  const Double e2  = sqrt((_a/_b-1)*(_a/_b+1));
  const Double z   = point.z();
  const Double rho = std::sqrt(point.x()*point.x()+point.y()*point.y());

  // start values
  L = (rho != 0.) ? point.lambda() : Angle(0);
  B = Angle(std::atan2(z*(1+e2*e2), rho));
  h = 0.0;

  // Iteration
  Double h1, B1;
  UInt   count = 0;
  do
  {
    h1 = h;
    B1 = B;
    const Double N = _a*(_a/(_b*std::sqrt(1+std::pow(e2*std::cos(B), 2))));
    h = (std::fabs(B) < (60*DEG2RAD)) ? (rho/std::cos(B) - N) : (z/std::sin(B) - N/(1+e2*e2));
    B = Angle(std::atan2(z*(1+e2*e2), rho*(1+e2*e2*h/(N+h))));
  }
  while(((std::fabs(h-h1) > 1e-6) || (std::fabs(B-B1) > 1e-10)) && (count++ < 1000));
}

/***********************************************/

const Vector3d Ellipsoid::operator()(Angle L, Angle B, Double h) const
{
  Double e2 = std::sqrt((_a/_b-1)*(_a/_b+1));
  Double N  = _a*(_a/(_b*std::sqrt(1+std::pow(e2*std::cos(B), 2))));

  return Vector3d((N+h) * std::cos(B) * std::cos(L),
                  (N+h) * std::cos(B) * std::sin(L),
                  (N/(1+e2*e2)+h)* std::sin(B));
}

/***********************************************/