45 f_ = 1.0 / 298.257222101;
49 a_ = std::numeric_limits<double>::quiet_NaN();
50 b_ = std::numeric_limits<double>::quiet_NaN();
51 f_ = std::numeric_limits<double>::quiet_NaN();
52 throw std::invalid_argument(
"Ellipsoid not defined");
54 e2_ = f_ * (2.0 - f_);
58 const std::vector<Eigen::Vector3d>& ell)
const {
59 std::vector<Eigen::Vector3d> xyz(ell.size());
61 for (
size_t i = 0; i < ell.size(); ++i) {
62 const double lat =
DegToRad(ell[i](0));
63 const double lon =
DegToRad(ell[i](1));
64 const double alt = ell[i](2);
66 const double sin_lat = sin(lat);
67 const double sin_lon = sin(lon);
68 const double cos_lat = cos(lat);
69 const double cos_lon = cos(lon);
72 const double N = a_ / sqrt(1 - e2_ * sin_lat * sin_lat);
74 xyz[i](0) = (N + alt) * cos_lat * cos_lon;
75 xyz[i](1) = (N + alt) * cos_lat * sin_lon;
76 xyz[i](2) = (N * (1 - e2_) + alt) * sin_lat;
83 const std::vector<Eigen::Vector3d>& xyz)
const {
84 std::vector<Eigen::Vector3d> ell(xyz.size());
86 for (
size_t i = 0; i < ell.size(); ++i) {
87 const double x = xyz[i](0);
88 const double y = xyz[i](1);
89 const double z = xyz[i](2);
91 const double radius_xy = sqrt(
x *
x +
y *
y);
92 const double kEps = 1
e-12;
95 double lat = atan2(
z, radius_xy);
98 for (
size_t j = 0; j < 100; ++j) {
99 const double sin_lat0 = sin(lat);
100 const double N = a_ / sqrt(1 - e2_ * sin_lat0 * sin_lat0);
101 alt = radius_xy / cos(lat) - N;
102 const double prev_lat = lat;
103 lat = atan((
z / radius_xy) * 1 / (1 - e2_ * N / (N + alt)));
105 if (std::abs(prev_lat - lat) < kEps) {
float RadToDeg(const float rad)
float DegToRad(const float deg)