9#include "geometry/ellipse.h"
10#include "geometry/polygon.h"
11#include "geometry/shape_concepts.h"
15 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
18 static std::uniform_real_distribution<T>
dist{ T{}, glm::two_pi<T>() };
22 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
25 static std::uniform_real_distribution<T>
dist{ T{}, T{360} };
29 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
32 return glm::rotate(glm::tvec2<T>{ T{ 1 }, T{ 0 } },
radians<T>(
rng));
35 template <
typename T,
typename RANDOM = std::default_random_engine>
41 template <
typename T,
typename RANDOM = std::default_random_engine>
48 template <
typename T,
typename RANDOM = std::default_random_engine>
51 const auto phi =
range(T{}, glm::two_pi<T>(),
rng);
56 template <
typename T,
typename RANDOM = std::default_random_engine>
65 template <
typename T,
typename RANDOM = std::default_random_engine>
68 if (poly.triangles().empty())
return {};
70 auto r =
range(T{}, poly.calculate_area());
74 if (!poly.has_triangle(
i))
77 r -= poly.triangle_area(
i);
83 return point_in(poly.triangle(
i),
rng);
87 template <
typename T, geometry::shape<T> S,
typename RANDOM = std::default_random_engine>
90 return s.edge_point_alpha(percentage(
rng));
120 template <
typename RANDOM = std::default_random_engine>
123 static std::uniform_int_distribution<typename RANDOM::result_type>
dist{ 0, 3 };
126 case 0:
return { 1.0f, 0.0f };
127 case 1:
return { 0.0f, 1.0f };
128 case 2:
return { -1.0f, 0.0f };
129 case 3:
return { 0.0f, -1.0f };
134 template <
typename RANDOM = std::default_random_engine>
137 static std::uniform_int_distribution<typename RANDOM::result_type>
dist{ 0, 3 };
140 case 0:
return { 1.0f, 1.0f };
141 case 1:
return { -1.0f, 1.0f };
142 case 2:
return { -1.0f, -1.0f };
143 case 3:
return { 1.0f, -1.0f };
148 template <
typename RANDOM = std::default_random_engine>
151 static std::uniform_int_distribution<typename RANDOM::result_type>
dist{ 0, 7 };
154 case 0:
return { 1.0f, 0.0f };
155 case 1:
return { 0.0f, 1.0f };
156 case 2:
return { -1.0f, 0.0f };
157 case 3:
return { 0.0f, -1.0f };
158 case 4:
return { 1.0f, 1.0f };
159 case 5:
return { -1.0f, 1.0f };
160 case 6:
return { -1.0f, -1.0f };
161 case 7:
return { 1.0f, -1.0f };
169 template <std::
floating_po
int T =
float>
constexpr auto bit_count
Equal to the number of bits in the type.
glm::ivec2 neighbor(RANDOM &rng=::ghassanpl::random::default_random_engine)
TODO: in(circle), in(poly)?, on(rect), on(circle), on(arc)
constexpr glm::tvec2< T > halton_sequence_2d(size_t index, size_t base_x=2, size_t base_y=3)
TODO: Should we move the below to random_seq?
glm::tvec2< T > point_on(S const &shape, RANDOM &rng=::ghassanpl::random::default_random_engine)
Returns a random point on the edge of the shape.
thread_local std::default_random_engine default_random_engine
TODO: Tests check out https://github.com/effolkronium/random/.