UFO 1.0.0
An Efficient Probabilistic 3D Mapping Framework That Embraces the Unknown
Loading...
Searching...
No Matches
point_cloud.hpp
1
42#ifndef UFO_CLOUD_POINT_CLOUD_HPP
43#define UFO_CLOUD_POINT_CLOUD_HPP
44
45// UFO
46#include <ufo/cloud/cloud.hpp>
47#include <ufo/execution/execution.hpp>
48#include <ufo/numeric/transform.hpp>
49#include <ufo/numeric/vec.hpp>
50
51// STL
52#include <algorithm>
53#include <cstddef>
54#include <limits>
55
56namespace ufo
57{
71template <std::size_t Dim, class T, class... Rest>
72using PointCloud = Cloud<Vec<Dim, T>, Rest...>;
73
86
87//
88// Transform
89//
90
104template <std::size_t Dim, class T, class... Rest>
105[[nodiscard]] PointCloud<Dim, T, Rest...> transform(Transform<Dim, T> const& t,
107{
108 transformInPlace(t, pc);
109 return pc;
110}
111
129template <class ExecutionPolicy, std::size_t Dim, class T, class... Rest>
130 requires execution::is_execution_policy_v<ExecutionPolicy>
131[[nodiscard]] PointCloud<Dim, T, Rest...> transform(ExecutionPolicy&& policy,
132 Transform<Dim, T> const& t,
134{
135 transformInPlace(std::forward<ExecutionPolicy>(policy), t, pc);
136 return pc;
137}
138
151template <std::size_t Dim, class T, class... Rest>
153{
154 auto v = view<0>(pc);
155 transform(v.begin(), v.end(), v.begin(), t);
156}
157
173template <class ExecutionPolicy, std::size_t Dim, class T, class... Rest>
174 requires execution::is_execution_policy_v<ExecutionPolicy>
177{
178 auto v = view<0>(pc);
179 transform(std::forward<ExecutionPolicy>(policy), v.begin(), v.end(), v.begin(), t);
180}
181
182//
183// Filter
184//
185
210template <std::size_t Dim, class T, class... Rest>
211[[nodiscard]] PointCloud<Dim, T, Rest...> filterDistance(PointCloud<Dim, T, Rest...> pc,
212 Vec<Dim, T> const& origin,
213 T const& min_distance,
214 T const& max_distance,
215 bool filter_nan = true)
216{
217 filterDistanceInPlace(pc, origin, min_distance, max_distance, filter_nan);
218 return pc;
219}
220
249template <std::size_t Dim, class T, class... Rest>
251 T const& min_distance, T const& max_distance,
252 bool filter_nan = true)
253{
254 if (T(0) >= min_distance && std::numeric_limits<T>::max() <= max_distance &&
255 !filter_nan) {
256 return;
257 }
258
259 auto const min_sq = min_distance * min_distance;
260 auto const max_sq = max_distance * max_distance;
261
262 auto to_erase = std::ranges::remove_if(
263 pc, [&origin, min_sq, max_sq, filter_nan](Vec<Dim, T> const& x) {
264 auto dist_sq = distanceSquared(origin, x);
265 return min_sq > dist_sq || max_sq < dist_sq || (filter_nan && isnan(x));
266 });
267 pc.erase(to_erase.begin(), to_erase.end());
268}
269} // namespace ufo
270
271#endif // UFO_CLOUD_POINT_CLOUD_HPP
Vec< 4, bool > isnan(Quat< T > const &q) noexcept
Returns a bool vector indicating which components are NaN.
Definition quat.hpp:1010
All vision-related classes and functions.
Definition cloud.hpp:49
constexpr auto distanceSquared(A const &a, B const &b)
Computes the minimum squared distance between two shapes.
Definition distance.hpp:80
void filterDistanceInPlace(PointCloud< Dim, T, Rest... > &pc, Vec< Dim, T > const &origin, T const &min_distance, T const &max_distance, bool filter_nan=true)
Removes in-place all points from pc that fall outside the given distance range.
void transformInPlace(Transform< Dim, T > const &t, PointCloud< Dim, T, Rest... > &pc)
Applies a rigid transform to every point position in-place.
PointCloud< Dim, T, Rest... > filterDistance(PointCloud< Dim, T, Rest... > pc, Vec< Dim, T > const &origin, T const &min_distance, T const &max_distance, bool filter_nan=true)
Returns a copy of pc with all points outside the given distance range removed.
PointCloud< Dim, T, Rest... > transform(Transform< Dim, T > const &t, PointCloud< Dim, T, Rest... > pc)
Applies a rigid transform to every point position and returns the result.
Rigid-body transform: a rotation matrix plus a translation vector.
Definition transform.hpp:81
A fixed-size arithmetic vector of up to 4 dimensions.
Definition vec.hpp:76