13template <
typename T,
size_t N>
struct GridND
15 std::vector<std::optional<Point<T, N>>>
cells;
30 const std::array<std::pair<T, T>,
N> &
ranges)
const
32 std::array<size_t, N>
idx{};
33 for (
size_t i = 0;
i <
N; ++
i)
37 idx[
i] =
static_cast<size_t>(std::floor(
pos));
49 for (
size_t i = 0;
i <
N; ++
i)
57 std::optional<Point<T, N>>
operator[](
const std::array<size_t, N> &
idx)
const
62 std::optional<Point<T, N>> &
operator[](
const std::array<size_t, N> &
idx)
68template <
typename T,
size_t N,
typename ScaleFn>
72 const std::array<std::pair<T, T>,
N> &
ranges,
87 for (
size_t i = 0;
i <
N; ++
i)
100 for (
size_t d = 0;
d <
N; ++
d)
118 for (
size_t i = 0;
i <
N; ++
i)
139template <
typename T,
size_t N>
146 std::uniform_real_distribution<T>
dist_radius(0, 1);
150 std::normal_distribution<T>
normal(0, 1);
157 for (
size_t i = 0;
i <
N; ++
i)
165 for (
size_t i = 0;
i <
N; ++
i)
173 for (
size_t i = 0;
i <
N; ++
i)
219template <
typename T,
size_t N,
typename ScaleFn>
222 const std::array<std::pair<T, T>,
N> &
ranges,
225 std::optional<unsigned int>
seed = std::nullopt,
231 std::mt19937
gen(
seed ? *
seed : std::random_device{}());
236 std::array<size_t, N> grid_size{};
237 for (
size_t i = 0;
i <
N; ++
i)
240 grid_size[
i] =
static_cast<size_t>(std::ceil(
axis_len / cell_size));
253 for (
size_t i = 0;
i <
N; ++
i)
284 for (
size_t d = 0;
d <
N; ++
d)
339template <
typename T,
size_t N>
342 const std::array<std::pair<T, T>,
N> &
ranges,
344 std::optional<unsigned int>
seed = std::nullopt,
411template <
typename T,
size_t N,
typename RadiusGen>
416 std::optional<unsigned int>
seed = std::nullopt,
419 std::mt19937
gen(
seed ? *
seed : std::random_device{}());
420 std::uniform_real_distribution<T>
uniform01(0.0, 1.0);
422 std::vector<Point<T, N>>
points;
423 std::vector<T>
radii;
434 for (
size_t d = 0;
d <
N; ++
d)
443 for (
size_t j = 0;
j <
points.size(); ++
j)
504template <
typename T,
size_t N>
511 std::optional<unsigned int>
seed = std::nullopt,
514 std::mt19937
gen(
seed ? *
seed : std::random_device{}());
515 std::uniform_real_distribution<T>
uni(0.0, 1.0);
576template <
typename T,
size_t N>
582 std::optional<unsigned int>
seed = std::nullopt,
585 std::mt19937
gen(
seed ? *
seed : std::random_device{}());
586 std::uniform_real_distribution<T>
uni(0.0, 1.0);
592 return lambda * std::pow(-std::log(1.0 -
u),
T(1) /
k);
634template <
typename T,
size_t N>
641 std::optional<unsigned int>
seed = std::nullopt,
644 std::mt19937
gen(
seed ? *
seed : std::random_device{}());
645 std::uniform_real_distribution<T>
uni(0.0, 1.0);
651 T r =
lambda * std::pow(-std::log(1 -
u),
T(1) /
k);
Definition dbscan_clustering.hpp:11
std::vector< Point< T, N > > poisson_disk_sampling_power_law(size_t n_points, T dist_min, T dist_max, T alpha, const std::array< std::pair< T, T >, N > &axis_ranges, std::optional< unsigned int > seed=std::nullopt, size_t max_attempts=30)
Generate N-dimensional points using Poisson disk sampling with a power-law radius distribution.
Definition poisson_disk_sampling.hpp:505
std::vector< Point< T, N > > poisson_disk_sampling_distance_distribution(size_t n_points, const std::array< std::pair< T, T >, N > &axis_ranges, RadiusGen &&radius_gen, std::optional< unsigned int > seed=std::nullopt, size_t max_attempts=30)
Generate random points with a variable-radius Poisson disk sampling.
Definition poisson_disk_sampling.hpp:412
std::vector< Point< T, N > > random(size_t count, const std::array< std::pair< T, T >, N > &axis_ranges, std::optional< unsigned int > seed=std::nullopt)
Generates a specified number of uniformly distributed random points in N-dimensional space.
Definition random.hpp:66
std::vector< Point< T, N > > poisson_disk_sampling_weibull(size_t n_points, T lambda, T k, const std::array< std::pair< T, T >, N > &axis_ranges, std::optional< unsigned int > seed=std::nullopt, size_t max_attempts=30)
Generate N-dimensional points using Poisson disk sampling with a Weibull-distributed radius.
Definition poisson_disk_sampling.hpp:577
std::vector< Point< T, N > > poisson_disk_sampling(size_t count, const std::array< std::pair< T, T >, N > &ranges, T base_min_dist, ScaleFn scale_fn, std::optional< unsigned int > seed=std::nullopt, size_t new_points_attempts=30)
Generate a set of Poisson disk samples in N-dimensional space, possibly with a warped metric.
Definition poisson_disk_sampling.hpp:220
std::vector< Point< T, N > > poisson_disk_sampling_uniform(size_t count, const std::array< std::pair< T, T >, N > &ranges, T base_min_dist, std::optional< unsigned int > seed=std::nullopt, size_t new_points_attempts=30)
Generate uniformly distributed Poisson disk samples in N-dimensional space.
Definition poisson_disk_sampling.hpp:340
Point< T, N > generate_random_point_around(const Point< T, N > ¢er, T base_min_dist, std::mt19937 &gen, std::function< T(const Point< T, N > &)> scale_fn)
Definition poisson_disk_sampling.hpp:140
T distance_squared(const Point< T, N > &a, const Point< T, N > &b)
Definition point.hpp:226
bool in_neighborhood(const GridND< T, N > &grid, const Point< T, N > &p, T base_min_dist, const std::array< std::pair< T, T >, N > &ranges, ScaleFn scale_fn)
Definition poisson_disk_sampling.hpp:69
Definition poisson_disk_sampling.hpp:14
std::vector< std::optional< Point< T, N > > > cells
Definition poisson_disk_sampling.hpp:15
std::array< size_t, N > grid_size
Definition poisson_disk_sampling.hpp:16
GridND(const std::array< size_t, N > &size, T cell_size_)
Definition poisson_disk_sampling.hpp:19
size_t linear_index(const std::array< size_t, N > &idx) const
Definition poisson_disk_sampling.hpp:45
std::array< size_t, N > point_to_grid(const Point< T, N > &p, const std::array< std::pair< T, T >, N > &ranges) const
Definition poisson_disk_sampling.hpp:29
std::optional< Point< T, N > > operator[](const std::array< size_t, N > &idx) const
Definition poisson_disk_sampling.hpp:57
T cell_size
Definition poisson_disk_sampling.hpp:17
std::optional< Point< T, N > > & operator[](const std::array< size_t, N > &idx)
Definition poisson_disk_sampling.hpp:62
A fixed-size N-dimensional point/vector class.
Definition point.hpp:39