Add uniform distribution inside a ball

This commit is contained in:
Nikita Lisitsa 2020-09-27 16:44:13 +03:00
parent 9949c0c232
commit 90ece36fd5

View file

@ -0,0 +1,61 @@
#pragma once
#include <psemek/pcg/random/uniform_sphere.hpp>
#include <psemek/pcg/random/uniform_real.hpp>
namespace psemek::pcg
{
template <typename T, std::size_t N>
struct uniform_ball_vector_distribution
{
using result_type = geom::vector<T, N>;
uniform_ball_vector_distribution(T r = T{1})
: sphere_d_{r}
{}
uniform_ball_vector_distribution(uniform_ball_vector_distribution const &) = default;
template <typename RNG>
auto operator()(RNG && rng)
{
result_type v = sphere_d_(rng);
auto r = uniform_real_distribution<T>{}(rng);
return v * std::pow(r, T{1} / N);
}
T radius() const { return sphere_d_.radius(); }
private:
uniform_sphere_vector_distribution<T, N> sphere_d_;
};
template <typename T, std::size_t N>
struct uniform_ball_point_distribution
{
using result_type = geom::vector<T, N>;
uniform_ball_point_distribution(result_type origin, T r = T{1})
: origin_{origin}
, vector_d_{r}
{}
uniform_ball_point_distribution(uniform_ball_point_distribution const &) = default;
template <typename RNG>
auto operator()(RNG && rng)
{
return origin_ + vector_d_(rng);
}
result_type origin() const { return origin_; }
T radius() const { return vector_d_.radius(); }
private:
result_type origin_;
uniform_ball_vector_distribution<T, N> vector_d_;
};
}