Files

113 lines
3.1 KiB
C
Raw Permalink Normal View History

2025-10-14 11:14:54 +08:00
#pragma once
#include "Ellipsoid.h"
#include "Library.h"
#include <CesiumGeometry/Plane.h>
#include <glm/fwd.hpp>
#include <glm/vec2.hpp>
#include <glm/vec3.hpp>
namespace CesiumGeospatial {
/**
* @brief A plane tangent to an {@link Ellipsoid} at a certain origin position.
*
* If the origin is not on the surface of the ellipsoid, its surface projection
* will be used.
*/
class CESIUMGEOSPATIAL_API EllipsoidTangentPlane final {
public:
/**
* @brief Creates a new instance.
*
* @param origin The origin, in cartesian coordinates.
* @param ellipsoid The ellipsoid. Default value: {@link Ellipsoid::WGS84}.
* @throws An `std::invalid_argument` if the given origin is at the
* center of the ellipsoid.
*/
EllipsoidTangentPlane(
const glm::dvec3& origin,
const Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
/**
* @brief Creates a new instance.
*
* @param eastNorthUpToFixedFrame A transform that was computed with
* {@link GlobeTransforms::eastNorthUpToFixedFrame}.
* @param ellipsoid The ellipsoid. Default value: {@link Ellipsoid::WGS84}.
*/
EllipsoidTangentPlane(
const glm::dmat4& eastNorthUpToFixedFrame,
const Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
/**
* @brief Returns the {@link Ellipsoid}.
*/
const Ellipsoid& getEllipsoid() const noexcept { return this->_ellipsoid; }
/**
* @brief Returns the origin, in cartesian coordinates.
*/
const glm::dvec3& getOrigin() const noexcept { return this->_origin; }
/**
* @brief Returns the x-axis of this plane.
*/
const glm::dvec3& getXAxis() const noexcept { return this->_xAxis; }
/**
* @brief Returns the y-axis of this plane.
*/
const glm::dvec3& getYAxis() const noexcept { return this->_yAxis; }
/**
* @brief Returns the z-axis (i.e. the normal) of this plane.
*/
const glm::dvec3& getZAxis() const noexcept {
return this->_plane.getNormal();
}
/**
* @brief Returns a {@link CesiumGeometry::Plane} representation of this
* plane.
*/
const CesiumGeometry::Plane& getPlane() const noexcept {
return this->_plane;
}
/**
* @brief Computes the position of the projection of the given point on this
* plane.
*
* Projects the given point on this plane, along the normal. The result will
* be a 2D point, referring to the local coordinate system of the plane that
* is given by the x- and y-axis.
*
* @param cartesian The point in cartesian coordinates.
* @return The 2D representation of the point on the plane that is closest to
* the given position.
*/
glm::dvec2
projectPointToNearestOnPlane(const glm::dvec3& cartesian) const noexcept;
private:
/**
* Computes the matrix that is used for the constructor (if the origin
* and ellipsoid are given), but throws an `std::invalid_argument` if
* the origin is at the center of the ellipsoid.
*/
static glm::dmat4 computeEastNorthUpToFixedFrame(
const glm::dvec3& origin,
const Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
Ellipsoid _ellipsoid;
glm::dvec3 _origin;
glm::dvec3 _xAxis;
glm::dvec3 _yAxis;
CesiumGeometry::Plane _plane;
};
} // namespace CesiumGeospatial