9#include "geometry/ellipse.h"
10#include "geometry/polygon.h"
11#include "geometry/shape_concepts.h"
12#define GLM_ENABLE_EXPERIMENTAL 1
13#include <glm/ext/scalar_constants.hpp>
14#include <glm/gtx/rotate_vector.hpp>
22 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
25 static std::uniform_real_distribution<T> dist{ T{}, glm::pi<T>() * 2 };
29 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
32 static std::uniform_real_distribution<T> dist{ T{}, T{360} };
36 template <std::
floating_po
int T =
float,
typename RANDOM = std::default_random_engine>
39 return glm::rotate(glm::tvec2<T>{ T{ 1 }, T{ 0 } }, radians<T>(rng));
42 template <
typename T,
typename RANDOM = std::default_random_engine>
45 return { in_range(rect.p1.x, rect.p2.x, rng), in_range(rect.p1.y, rect.p2.y, rng) };
48 template <
typename T,
typename RANDOM = std::default_random_engine>
51 return { in_range(T{}, max.x, rng), in_range(T{}, max.y, rng) };
55 template <
typename T,
typename RANDOM = std::default_random_engine>
58 const auto phi = between(T{}, glm::two_pi<T>(), rng);
59 const auto p = glm::tvec2<T>{ cos(phi), sin(phi) } * glm::sqrt(
percentage<T>(rng)) * el.radii * T(0.5);
63 template <
typename T,
typename RANDOM = std::default_random_engine>
69 return (tr.a * (T(1) - r1) + tr.b * (r1 * (T(1) - r2)) + tr.c * (r2 * r1));
72 template <
typename T,
typename RANDOM = std::default_random_engine>
75 if (poly.triangles().empty())
return {};
77 auto r = between(T{}, poly.calculate_area());
81 if (!poly.has_triangle(i))
84 r -= poly.triangle_area(i);
90 return point_in(poly.triangle(i), rng);
94 template <
typename T, geometry::shape<T> S,
typename RANDOM = std::default_random_engine>
97 return shape.edge_point_alpha(
percentage(rng));
106 const std::array<ghassanpl::trec2<T>, 4> surrounding = {
107 ghassanpl::trec2<T>{ bounds.p1.x, bounds.p1.y, bounds.p2.x, verboten.p1.y },
108 ghassanpl::trec2<T>{ bounds.p1.x, verboten.p2.y, bounds.p2.x, bounds.p2.y },
109 ghassanpl::trec2<T>{ bounds.p1.x, bounds.p1.y, verboten.p1.x, bounds.p2.y },
110 ghassanpl::trec2<T>{ verboten.p2.x, bounds.p1.y, bounds.p2.x, bounds.p2.y },
112 const std::array<T, 4> areas = {
113 surrounding[0].calculate_area(),
114 surrounding[1].calculate_area(),
115 surrounding[2].calculate_area(),
116 surrounding[3].calculate_area()
118 const int total_area = areas[0] + areas[1] + areas[2] + areas[3];
119 const int rand_pos = RandomIn(total_area);
120 if (rand_pos < areas[0]) return Random(surrounding[0]);
121 if (rand_pos < areas[0] + areas[1]) return Random(surrounding[1]);
122 if (rand_pos < areas[0] + areas[1] + areas[2]) return Random(surrounding[2]);
123 return Random(surrounding[3]);
127 template <
typename RANDOM = std::default_random_engine>
130 static std::uniform_int_distribution<typename RANDOM::result_type> dist{ 0, 3 };
133 case 0:
return { 1.0f, 0.0f };
134 case 1:
return { 0.0f, 1.0f };
135 case 2:
return { -1.0f, 0.0f };
136 case 3:
return { 0.0f, -1.0f };
141 template <
typename RANDOM = std::default_random_engine>
144 static std::uniform_int_distribution<typename RANDOM::result_type> dist{ 0, 3 };
147 case 0:
return { 1.0f, 1.0f };
148 case 1:
return { -1.0f, 1.0f };
149 case 2:
return { -1.0f, -1.0f };
150 case 3:
return { 1.0f, -1.0f };
155 template <
typename RANDOM = std::default_random_engine>
158 static std::uniform_int_distribution<typename RANDOM::result_type> dist{ 0, 7 };
161 case 0:
return { 1.0f, 0.0f };
162 case 1:
return { 0.0f, 1.0f };
163 case 2:
return { -1.0f, 0.0f };
164 case 3:
return { 0.0f, -1.0f };
165 case 4:
return { 1.0f, 1.0f };
166 case 5:
return { -1.0f, 1.0f };
167 case 6:
return { -1.0f, -1.0f };
168 case 7:
return { 1.0f, -1.0f };
176 template <std::
floating_po
int T =
float>
179 return { halton_sequence<T>(
index, base_x), halton_sequence<T>(
index, base_y) };
constexpr glm::tvec2< T > halton_sequence_2d(size_t index, size_t base_x=2, size_t base_y=3)
Returns the nth quasi-random vector in the [0, 1]^2 space.
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.
std::default_random_engine default_random_engine
A thread-local random engine used by default by all random functions.
REAL percentage(RANDOM &rng=::ghassanpl::random::default_random_engine)
Returns a random value between 0 and 1 of the given floating-point type.
auto index(T &cont, RANDOM &rng=::ghassanpl::random::default_random_engine)
Returns an index of a random element in cont.
Represents a 2D, axis-aligned ellipse area_shape.