UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
ellipsoid.hpp
1
42#ifndef UFO_GEOMETRY_ELLIPSOID_HPP
43#define UFO_GEOMETRY_ELLIPSOID_HPP
44
45// UFO
46#include <ufo/geometry/aabb.hpp>
47#include <ufo/numeric/vec.hpp>
48
49// STL
50#include <concepts>
51#include <cstddef>
52#include <format>
53#include <numbers>
54#include <ostream>
55
56namespace ufo
57{
66template <std::size_t Dim = 3, std::floating_point T = float>
67struct Ellipsoid {
68 using value_type = T;
69
74
79
83 constexpr Ellipsoid() noexcept = default;
84
90 constexpr Ellipsoid(Vec<Dim, T> center, Vec<Dim, T> radii) noexcept
92 {
93 }
94
98 constexpr Ellipsoid(Ellipsoid const&) noexcept = default;
99
105 template <std::convertible_to<T> U>
106 constexpr explicit Ellipsoid(Ellipsoid<Dim, U> const& other) noexcept
107 : center_(Vec<Dim, T>(other.center())), radii(Vec<Dim, T>(other.radii))
108 {
109 }
110
115 [[nodiscard]] constexpr Vec<Dim, T>& center() noexcept { return center_; }
116
121 [[nodiscard]] constexpr Vec<Dim, T> const& center() const noexcept { return center_; }
122
127 [[nodiscard]] static constexpr std::size_t dimension() noexcept { return Dim; }
128
133 [[nodiscard]] constexpr Vec<Dim, T> min() const noexcept { return center_ - radii; }
134
139 [[nodiscard]] constexpr Vec<Dim, T> max() const noexcept { return center_ + radii; }
140
145 [[nodiscard]] constexpr AABB<Dim, T> aabb() const noexcept
146 {
147 return AABB<Dim, T>(center_, radii);
148 }
149
154 [[nodiscard]] constexpr bool isDegenerate() const noexcept
155 {
156 return any(lessThan(radii, Vec<Dim, T>()));
157 }
158
163 [[nodiscard]] constexpr T diameter() const noexcept { return T(2) * ufo::max(radii); }
164
169 [[nodiscard]] constexpr T volume() const noexcept
170 {
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] *
179 radii[2] * radii[3]) /
180 T(2);
181 } else {
182 // For higher dimensions, it would need a more general formula (Gamma function)
183 return T(0);
184 }
185 }
186
193 [[nodiscard]] bool operator==(Ellipsoid const&) const = default;
194};
195
196//
197// Deduction guides
198//
199
200template <std::size_t Dim, std::floating_point T>
202
209template <std::size_t Dim, std::floating_point T>
210std::ostream& operator<<(std::ostream& out, Ellipsoid<Dim, T> const& ellipsoid)
211{
212 return out << "Center: [" << ellipsoid.center() << "], radii: [" << ellipsoid.radii
213 << "]";
214}
215
216template <std::floating_point T>
217using Ellipsoid1 = Ellipsoid<1, T>;
218template <std::floating_point T>
219using Ellipsoid2 = Ellipsoid<2, T>;
220template <std::floating_point T>
221using Ellipsoid3 = Ellipsoid<3, T>;
222template <std::floating_point T>
223using Ellipsoid4 = Ellipsoid<4, T>;
224
225using Ellipsoid1f = Ellipsoid<1, float>;
226using Ellipsoid2f = Ellipsoid<2, float>;
227using Ellipsoid3f = Ellipsoid<3, float>;
228using Ellipsoid4f = Ellipsoid<4, float>;
229
230using Ellipsoid1d = Ellipsoid<1, double>;
231using Ellipsoid2d = Ellipsoid<2, double>;
232using Ellipsoid3d = Ellipsoid<3, double>;
233using Ellipsoid4d = Ellipsoid<4, double>;
234
235} // namespace ufo
236
237template <std::size_t Dim, std::floating_point 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(); }
241
242 auto format(ufo::Ellipsoid<Dim, T> const& ellipsoid, std::format_context& ctx) const
243 {
244 return std::format_to(ctx.out(), "Center: [{}], radii: [{}]", ellipsoid.center(),
245 ellipsoid.radii);
246 }
247};
248
249#endif // UFO_GEOMETRY_ELLIPSOID_HPP
All vision-related classes and functions.
Definition cloud.hpp:49
constexpr bool any(Vec< Dim, bool > const &v) noexcept
Returns true if at least one component of a bool vector is true.
Definition vec.hpp:1560
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.
Definition fun.hpp:72
Axis-Aligned Bounding Box (AABB) in Dim-dimensional space.
Definition aabb.hpp:70
Ellipsoid in Dim-dimensional space.
Definition ellipsoid.hpp:67
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.
Definition ellipsoid.hpp:73
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.
Definition ellipsoid.hpp:78
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.
Definition vec.hpp:76