42#ifndef UFO_CLOUD_POINT_CLOUD_HPP
43#define UFO_CLOUD_POINT_CLOUD_HPP
46#include <ufo/cloud/cloud.hpp>
47#include <ufo/execution/execution.hpp>
48#include <ufo/numeric/transform.hpp>
49#include <ufo/numeric/vec.hpp>
71template <std::size_t Dim,
class T,
class... Rest>
104template <std::size_t Dim,
class T,
class... Rest>
129template <
class ExecutionPolicy, std::size_t Dim,
class T,
class... Rest>
130 requires execution::is_execution_policy_v<ExecutionPolicy>
151template <std::size_t Dim,
class T,
class... Rest>
154 auto v = view<0>(pc);
155 transform(v.begin(), v.end(), v.begin(), t);
173template <
class ExecutionPolicy, std::size_t Dim,
class T,
class... Rest>
174 requires execution::is_execution_policy_v<ExecutionPolicy>
178 auto v = view<0>(pc);
179 transform(std::forward<ExecutionPolicy>(policy), v.begin(), v.end(), v.begin(), t);
210template <std::size_t Dim,
class T,
class... Rest>
213 T
const& min_distance,
214 T
const& max_distance,
215 bool filter_nan =
true)
249template <std::size_t Dim,
class T,
class... Rest>
251 T
const& min_distance, T
const& max_distance,
252 bool filter_nan =
true)
254 if (T(0) >= min_distance && std::numeric_limits<T>::max() <= max_distance &&
259 auto const min_sq = min_distance * min_distance;
260 auto const max_sq = max_distance * max_distance;
262 auto to_erase = std::ranges::remove_if(
263 pc, [&origin, min_sq, max_sq, filter_nan](
Vec<Dim, T> const& x) {
265 return min_sq > dist_sq || max_sq < dist_sq || (filter_nan &&
isnan(x));
267 pc.erase(to_erase.begin(), to_erase.end());
Vec< 4, bool > isnan(Quat< T > const &q) noexcept
Returns a bool vector indicating which components are NaN.
All vision-related classes and functions.
constexpr auto distanceSquared(A const &a, B const &b)
Computes the minimum squared distance between two shapes.
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.
A fixed-size arithmetic vector of up to 4 dimensions.