Support retrieving distribution parameters

This commit is contained in:
Nikita Lisitsa 2020-09-27 16:44:02 +03:00
parent eb5577909a
commit 9949c0c232
5 changed files with 35 additions and 4 deletions

View file

@ -2,7 +2,7 @@
#include <psemek/geom/point.hpp> #include <psemek/geom/point.hpp>
#include <psemek/geom/box.hpp> #include <psemek/geom/box.hpp>
#include <psemek/pcg/random/uniform_real.hpp> #include <psemek/pcg/random/uniform.hpp>
namespace psemek::pcg namespace psemek::pcg
{ {
@ -10,13 +10,13 @@ namespace psemek::pcg
template <typename T, std::size_t N> template <typename T, std::size_t N>
struct box_point_distribution struct box_point_distribution
{ {
uniform_real_distribution<T> d[N]; using result_type = geom::point<T, N>;
box_point_distribution(geom::box<T, N> const & b) box_point_distribution(geom::box<T, N> const & b)
{ {
for (std::size_t i = 0; i < N; ++i) for (std::size_t i = 0; i < N; ++i)
{ {
d[i] = uniform_real_distribution<T>{b[i]}; d_[i] = uniform_distribution<T>{b[i]};
} }
} }
@ -27,9 +27,20 @@ namespace psemek::pcg
{ {
geom::point<T, N> p; geom::point<T, N> p;
for (std::size_t i = 0; i < N; ++i) for (std::size_t i = 0; i < N; ++i)
p[i] = d[i](rng); p[i] = d_[i](rng);
return p; return p;
} }
geom::box<T, N> box() const
{
geom::box<T, N> result;
for (std::size_t i = 0; i < N; ++i)
result[i] = d_[i].range();
return result;
}
private:
uniform_distribution<T> d_[N];
}; };
} }

View file

@ -31,6 +31,10 @@ namespace psemek::pcg
template <typename RNG> template <typename RNG>
T operator()(RNG && rng); T operator()(RNG && rng);
T mean() const { return mean_; }
T stddev() const { return stddev_; }
private: private:
T mean_; T mean_;
T stddev_; T stddev_;

View file

@ -32,6 +32,8 @@ namespace psemek::pcg
template <typename RNG> template <typename RNG>
T operator()(RNG && rng); T operator()(RNG && rng);
geom::interval<T> range() const { return range_; }
private: private:
geom::interval<T> range_; geom::interval<T> range_;

View file

@ -32,6 +32,8 @@ namespace psemek::pcg
template <typename RNG> template <typename RNG>
T operator()(RNG && rng); T operator()(RNG && rng);
geom::interval<T> range() const { return range_; }
private: private:
geom::interval<T> range_; geom::interval<T> range_;

View file

@ -35,6 +35,8 @@ namespace psemek::pcg
} }
} }
T radius() const { return r_; }
private: private:
normal_distribution<T> d_; normal_distribution<T> d_;
T r_; T r_;
@ -60,6 +62,8 @@ namespace psemek::pcg
return {-r_}; return {-r_};
} }
T radius() const { return r_; }
private: private:
T r_; T r_;
}; };
@ -83,6 +87,8 @@ namespace psemek::pcg
return r_ * result_type{std::cos(a), std::sin(a)}; return r_ * result_type{std::cos(a), std::sin(a)};
} }
T radius() const { return r_; }
private: private:
T r_; T r_;
}; };
@ -116,6 +122,8 @@ namespace psemek::pcg
} }
} }
T radius() const { return r_; }
private: private:
T r_; T r_;
}; };
@ -136,6 +144,10 @@ namespace psemek::pcg
return origin_ + vector_d_(rng); return origin_ + vector_d_(rng);
} }
result_type origin() const { return origin_; }
T radius() const { return vector_d_.radius(); }
private: private:
result_type origin_; result_type origin_;
uniform_sphere_vector_distribution<T, N> vector_d_; uniform_sphere_vector_distribution<T, N> vector_d_;