Files
BXSSP_Andriod/Plugins/CesiumForUnreal/Source/ThirdParty/include/CesiumGeometry/Plane.h

112 lines
3.4 KiB
C++

#pragma once
#include "Library.h"
#include <glm/vec3.hpp>
namespace CesiumGeometry {
/**
* @brief A plane in Hessian Normal Format.
*/
class CESIUMGEOMETRY_API Plane final {
public:
/**
* @brief The XY plane passing through the origin, with normal in positive Z.
*/
static const Plane ORIGIN_XY_PLANE;
/**
* @brief The YZ plane passing through the origin, with normal in positive X.
*/
static const Plane ORIGIN_YZ_PLANE;
/**
* @brief The ZX plane passing through the origin, with normal in positive Y.
*/
static const Plane ORIGIN_ZX_PLANE;
/**
* @brief Constructs a new plane with a +Z normal and a distance of 0.0.
*/
Plane() noexcept;
/**
* @brief Constructs a new plane from a normal and a distance from the origin.
*
* The plane is defined by:
* ```
* ax + by + cz + d = 0
* ```
* where (a, b, c) is the plane's `normal`, d is the signed
* `distance` to the plane, and (x, y, z) is any point on
* the plane.
*
* @param normal The plane's normal (normalized).
* @param distance The shortest distance from the origin to the plane. The
* sign of `distance` determines which side of the plane the origin is on. If
* `distance` is positive, the origin is in the half-space in the direction of
* the normal; if negative, the origin is in the half-space opposite to the
* normal; if zero, the plane passes through the origin.
*
* @exception std::exception `normal` must be normalized.
*
* Example:
* @snippet TestPlane.cpp constructor-normal-distance
*/
Plane(const glm::dvec3& normal, double distance);
/**
* @brief Construct a new plane from a point in the plane and the plane's
* normal.
*
* @param point The point on the plane.
* @param normal The plane's normal (normalized).
*
* @exception std::exception `normal` must be normalized.
*
* Example:
* @snippet TestPlane.cpp constructor-point-normal
*/
Plane(const glm::dvec3& point, const glm::dvec3& normal);
/**
* @brief Gets the plane's normal.
*/
const glm::dvec3& getNormal() const noexcept { return this->_normal; }
/**
* @brief Gets the signed shortest distance from the origin to the plane.
* The sign of `distance` determines which side of the plane the origin
* is on. If `distance` is positive, the origin is in the half-space
* in the direction of the normal; if negative, the origin is in the
* half-space opposite to the normal; if zero, the plane passes through the
* origin.
*/
double getDistance() const noexcept { return this->_distance; }
/**
* @brief Computes the signed shortest distance of a point to this plane.
* The sign of the distance determines which side of the plane the point
* is on. If the distance is positive, the point is in the half-space
* in the direction of the normal; if negative, the point is in the half-space
* opposite to the normal; if zero, the plane passes through the point.
*
* @param point The point.
* @returns The signed shortest distance of the point to the plane.
*/
double getPointDistance(const glm::dvec3& point) const noexcept;
/**
* @brief Projects a point onto this plane.
* @param point The point to project onto the plane.
* @returns The projected point.
*/
glm::dvec3 projectPointOntoPlane(const glm::dvec3& point) const noexcept;
private:
glm::dvec3 _normal;
double _distance;
};
} // namespace CesiumGeometry