cesium-native 0.44.2
Loading...
Searching...
No Matches
Ellipsoid.h
1#pragma once
2
3#include <CesiumGeospatial/Cartographic.h>
4#include <CesiumGeospatial/Library.h>
5#include <CesiumUtility/Math.h>
6
7#include <glm/vec3.hpp>
8
9#include <optional>
10
11// The comments are copied here so that the doc comment always shows up in
12// Intellisense whether the default is toggled or not.
13#ifndef CESIUM_DISABLE_DEFAULT_ELLIPSOID
14// To keep from breaking our API, a lot of things now need default Ellipsoid
15// parameters. However, we shouldn't rely on these defaults internally, so
16// disabling them is a good way to get a compile-time check that they're not
17// being used. This macro allows us to toggle this check.
18#define CESIUM_DEFAULT_ELLIPSOID = CesiumGeospatial::Ellipsoid::WGS84
19#else
20// To keep from breaking our API, a lot of things now need default Ellipsoid
21// parameters. However, we shouldn't rely on these defaults internally, so
22// disabling them is a good way to get a compile-time check that they're not
23// being used. This macro allows us to toggle this check.
24#define CESIUM_DEFAULT_ELLIPSOID
25#endif
26
27namespace CesiumGeospatial {
28
39class CESIUMGEOSPATIAL_API Ellipsoid final {
40public:
48 static /*constexpr*/ const Ellipsoid WGS84;
49
53 static const Ellipsoid UNIT_SPHERE;
54
62 constexpr Ellipsoid(double x, double y, double z) noexcept
63 : Ellipsoid(glm::dvec3(x, y, z)) {}
64
70 constexpr Ellipsoid(const glm::dvec3& radii) noexcept
71 : _radii(radii),
72 _radiiSquared(radii.x * radii.x, radii.y * radii.y, radii.z * radii.z),
73 _oneOverRadii(1.0 / radii.x, 1.0 / radii.y, 1.0 / radii.z),
74 _oneOverRadiiSquared(
75 1.0 / (radii.x * radii.x),
76 1.0 / (radii.y * radii.y),
77 1.0 / (radii.z * radii.z)),
78 _centerToleranceSquared(CesiumUtility::Math::Epsilon1) {}
79
83 constexpr const glm::dvec3& getRadii() const noexcept { return this->_radii; }
84
93 glm::dvec3 geodeticSurfaceNormal(const glm::dvec3& position) const noexcept;
94
103 glm::dvec3
104 geodeticSurfaceNormal(const Cartographic& cartographic) const noexcept;
105
113 glm::dvec3
114 cartographicToCartesian(const Cartographic& cartographic) const noexcept;
115
127 std::optional<Cartographic>
128 cartesianToCartographic(const glm::dvec3& cartesian) const noexcept;
129
141 std::optional<glm::dvec3>
142 scaleToGeodeticSurface(const glm::dvec3& cartesian) const noexcept;
143
152 std::optional<glm::dvec3>
153 scaleToGeocentricSurface(const glm::dvec3& cartesian) const noexcept;
154
160 constexpr double getMaximumRadius() const noexcept {
161 return glm::max(this->_radii.x, glm::max(this->_radii.y, this->_radii.z));
162 }
163
169 constexpr double getMinimumRadius() const noexcept {
170 return glm::min(this->_radii.x, glm::min(this->_radii.y, this->_radii.z));
171 }
172
176 constexpr bool operator==(const Ellipsoid& rhs) const noexcept {
177 return this->_radii == rhs._radii;
178 };
179
183 constexpr bool operator!=(const Ellipsoid& rhs) const noexcept {
184 return !(*this == rhs);
185 };
186
187private:
188 glm::dvec3 _radii;
189 glm::dvec3 _radiiSquared;
190 glm::dvec3 _oneOverRadii;
191 glm::dvec3 _oneOverRadiiSquared;
192 double _centerToleranceSquared;
193};
194} // namespace CesiumGeospatial
A position defined by longitude, latitude, and height.
A quadratic surface defined in Cartesian coordinates.
Definition Ellipsoid.h:39
static const Ellipsoid WGS84
An Ellipsoid instance initialized to the WGS84 standard.
Definition Ellipsoid.h:48
std::optional< glm::dvec3 > scaleToGeocentricSurface(const glm::dvec3 &cartesian) const noexcept
Scales the provided cartesian position along the geocentric surface normal so that it is on the surfa...
constexpr const glm::dvec3 & getRadii() const noexcept
Returns the radii in x-, y-, and z-direction.
Definition Ellipsoid.h:83
constexpr double getMinimumRadius() const noexcept
The minimum radius in any dimension.
Definition Ellipsoid.h:169
glm::dvec3 cartographicToCartesian(const Cartographic &cartographic) const noexcept
Converts the provided Cartographic to cartesian representation.
glm::dvec3 geodeticSurfaceNormal(const Cartographic &cartographic) const noexcept
Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.
constexpr bool operator!=(const Ellipsoid &rhs) const noexcept
Returns true if two elliposids are not equal.
Definition Ellipsoid.h:183
constexpr bool operator==(const Ellipsoid &rhs) const noexcept
Returns true if two elliposids are equal.
Definition Ellipsoid.h:176
std::optional< Cartographic > cartesianToCartographic(const glm::dvec3 &cartesian) const noexcept
Converts the provided cartesian to a Cartographic representation.
constexpr Ellipsoid(double x, double y, double z) noexcept
Creates a new instance.
Definition Ellipsoid.h:62
constexpr double getMaximumRadius() const noexcept
The maximum radius in any dimension.
Definition Ellipsoid.h:160
static const Ellipsoid UNIT_SPHERE
An Ellipsoid with all three radii set to one meter.
Definition Ellipsoid.h:53
constexpr Ellipsoid(const glm::dvec3 &radii) noexcept
Creates a new instance.
Definition Ellipsoid.h:70
std::optional< glm::dvec3 > scaleToGeodeticSurface(const glm::dvec3 &cartesian) const noexcept
Scales the given cartesian position along the geodetic surface normal so that it is on the surface of...
glm::dvec3 geodeticSurfaceNormal(const glm::dvec3 &position) const noexcept
Computes the normal of the plane tangent to the surface of the ellipsoid at the provided position.
static constexpr double Epsilon1
0.1
Definition Math.h:15
Classes for geospatial computations in Cesium.