42#ifndef UFO_GEOMETRY_ELLIPSOID_HPP
43#define UFO_GEOMETRY_ELLIPSOID_HPP
46#include <ufo/geometry/aabb.hpp>
47#include <ufo/numeric/vec.hpp>
66template <std::
size_t Dim = 3, std::
floating_po
int T =
float>
105 template <std::convertible_to<T> U>
127 [[nodiscard]]
static constexpr std::size_t
dimension() noexcept {
return Dim; }
169 [[nodiscard]]
constexpr T
volume() const noexcept
171 if constexpr (1 == Dim) {
172 return radii[0] * T(2);
173 }
else if constexpr (2 == Dim) {
174 return std::numbers::pi_v<T> *
radii[0] *
radii[1];
175 }
else if constexpr (3 == Dim) {
176 return (T(4) / T(3)) * std::numbers::pi_v<T> *
radii[0] *
radii[1] *
radii[2];
177 }
else if constexpr (4 == Dim) {
178 return (std::numbers::pi_v<T> * std::numbers::pi_v<T> *
radii[0] *
radii[1] *
200template <std::
size_t Dim, std::
floating_po
int T>
209template <std::
size_t Dim, std::
floating_po
int T>
212 return out <<
"Center: [" << ellipsoid.
center() <<
"], radii: [" << ellipsoid.
radii
216template <std::
floating_po
int T>
217using Ellipsoid1 = Ellipsoid<1, T>;
218template <std::
floating_po
int T>
219using Ellipsoid2 = Ellipsoid<2, T>;
220template <std::
floating_po
int T>
221using Ellipsoid3 = Ellipsoid<3, T>;
222template <std::
floating_po
int T>
223using Ellipsoid4 = Ellipsoid<4, T>;
225using Ellipsoid1f = Ellipsoid<1, float>;
226using Ellipsoid2f = Ellipsoid<2, float>;
227using Ellipsoid3f = Ellipsoid<3, float>;
228using Ellipsoid4f = Ellipsoid<4, float>;
230using Ellipsoid1d = Ellipsoid<1, double>;
231using Ellipsoid2d = Ellipsoid<2, double>;
232using Ellipsoid3d = Ellipsoid<3, double>;
233using Ellipsoid4d = Ellipsoid<4, double>;
237template <std::
size_t Dim, std::
floating_po
int T>
238 requires std::formattable<T, char>
239struct std::formatter<
ufo::Ellipsoid<Dim, T>> {
240 constexpr auto parse(std::format_parse_context& ctx) {
return ctx.begin(); }
244 return std::format_to(ctx.out(),
"Center: [{}], radii: [{}]", ellipsoid.
center(),
All vision-related classes and functions.
constexpr bool any(Vec< Dim, bool > const &v) noexcept
Returns true if at least one component of a bool vector is true.
constexpr Vec< Geometry::dimension(), typename Geometry::value_type > max(Geometry const &g)
Returns the maximum coordinate of the minimum spanning axis-aligned bounding box of a geometry.
Axis-Aligned Bounding Box (AABB) in Dim-dimensional space.
Ellipsoid in Dim-dimensional space.
constexpr Vec< Dim, T > const & center() const noexcept
Returns the center of the ellipsoid.
constexpr T volume() const noexcept
Returns the volume of the ellipsoid.
constexpr Vec< Dim, T > max() const noexcept
Returns the maximum point of the ellipsoid's AABB.
constexpr T diameter() const noexcept
Returns the diameter of the ellipsoid.
Vec< Dim, T > center_
The center of the ellipsoid.
constexpr bool isDegenerate() const noexcept
Returns whether the ellipsoid is degenerate.
constexpr Ellipsoid() noexcept=default
Default constructor.
constexpr AABB< Dim, T > aabb() const noexcept
Returns the AABB of the ellipsoid.
bool operator==(Ellipsoid const &) const =default
Equality operator.
constexpr Vec< Dim, T > min() const noexcept
Returns the minimum point of the ellipsoid's AABB.
static constexpr std::size_t dimension() noexcept
Returns the dimensionality of the ellipsoid.
constexpr Ellipsoid(Ellipsoid const &) noexcept=default
Copy constructor.
Vec< Dim, T > radii
The radii of the ellipsoid along each axis.
constexpr Vec< Dim, T > & center() noexcept
Returns the center of the ellipsoid.
constexpr Ellipsoid(Ellipsoid< Dim, U > const &other) noexcept
Converting constructor from an ellipsoid with a different scalar type.
A fixed-size arithmetic vector of up to 4 dimensions.