From 9949c0c2323c55aea50c9e069821edd5366876fb Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 27 Sep 2020 16:44:02 +0300 Subject: [PATCH] Support retrieving distribution parameters --- libs/pcg/include/psemek/pcg/random/box.hpp | 19 +++++++++++++++---- libs/pcg/include/psemek/pcg/random/normal.hpp | 4 ++++ .../include/psemek/pcg/random/uniform_int.hpp | 2 ++ .../psemek/pcg/random/uniform_real.hpp | 2 ++ .../psemek/pcg/random/uniform_sphere.hpp | 12 ++++++++++++ 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/libs/pcg/include/psemek/pcg/random/box.hpp b/libs/pcg/include/psemek/pcg/random/box.hpp index fbfd73c7..d5429e48 100644 --- a/libs/pcg/include/psemek/pcg/random/box.hpp +++ b/libs/pcg/include/psemek/pcg/random/box.hpp @@ -2,7 +2,7 @@ #include #include -#include +#include namespace psemek::pcg { @@ -10,13 +10,13 @@ namespace psemek::pcg template struct box_point_distribution { - uniform_real_distribution d[N]; + using result_type = geom::point; box_point_distribution(geom::box const & b) { for (std::size_t i = 0; i < N; ++i) { - d[i] = uniform_real_distribution{b[i]}; + d_[i] = uniform_distribution{b[i]}; } } @@ -27,9 +27,20 @@ namespace psemek::pcg { geom::point p; for (std::size_t i = 0; i < N; ++i) - p[i] = d[i](rng); + p[i] = d_[i](rng); return p; } + + geom::box box() const + { + geom::box result; + for (std::size_t i = 0; i < N; ++i) + result[i] = d_[i].range(); + return result; + } + + private: + uniform_distribution d_[N]; }; } diff --git a/libs/pcg/include/psemek/pcg/random/normal.hpp b/libs/pcg/include/psemek/pcg/random/normal.hpp index 585ebaee..2cbf5c4d 100644 --- a/libs/pcg/include/psemek/pcg/random/normal.hpp +++ b/libs/pcg/include/psemek/pcg/random/normal.hpp @@ -31,6 +31,10 @@ namespace psemek::pcg template T operator()(RNG && rng); + T mean() const { return mean_; } + + T stddev() const { return stddev_; } + private: T mean_; T stddev_; diff --git a/libs/pcg/include/psemek/pcg/random/uniform_int.hpp b/libs/pcg/include/psemek/pcg/random/uniform_int.hpp index d4d65d9c..ae08fba4 100644 --- a/libs/pcg/include/psemek/pcg/random/uniform_int.hpp +++ b/libs/pcg/include/psemek/pcg/random/uniform_int.hpp @@ -32,6 +32,8 @@ namespace psemek::pcg template T operator()(RNG && rng); + geom::interval range() const { return range_; } + private: geom::interval range_; diff --git a/libs/pcg/include/psemek/pcg/random/uniform_real.hpp b/libs/pcg/include/psemek/pcg/random/uniform_real.hpp index ecb9157d..c32ca8ae 100644 --- a/libs/pcg/include/psemek/pcg/random/uniform_real.hpp +++ b/libs/pcg/include/psemek/pcg/random/uniform_real.hpp @@ -32,6 +32,8 @@ namespace psemek::pcg template T operator()(RNG && rng); + geom::interval range() const { return range_; } + private: geom::interval range_; diff --git a/libs/pcg/include/psemek/pcg/random/uniform_sphere.hpp b/libs/pcg/include/psemek/pcg/random/uniform_sphere.hpp index 663cb5c0..31c1dcc9 100644 --- a/libs/pcg/include/psemek/pcg/random/uniform_sphere.hpp +++ b/libs/pcg/include/psemek/pcg/random/uniform_sphere.hpp @@ -35,6 +35,8 @@ namespace psemek::pcg } } + T radius() const { return r_; } + private: normal_distribution d_; T r_; @@ -60,6 +62,8 @@ namespace psemek::pcg return {-r_}; } + T radius() const { return r_; } + private: T r_; }; @@ -83,6 +87,8 @@ namespace psemek::pcg return r_ * result_type{std::cos(a), std::sin(a)}; } + T radius() const { return r_; } + private: T r_; }; @@ -116,6 +122,8 @@ namespace psemek::pcg } } + T radius() const { return r_; } + private: T r_; }; @@ -136,6 +144,10 @@ namespace psemek::pcg return origin_ + vector_d_(rng); } + result_type origin() const { return origin_; } + + T radius() const { return vector_d_.radius(); } + private: result_type origin_; uniform_sphere_vector_distribution vector_d_;