lbf/samplers/
uniform_rect_sampler.rs

1use crate::samplers::rotation_distr::UniformRotDistr;
2use jagua_rs::entities::Item;
3use jagua_rs::geometry::DTransformation;
4use jagua_rs::geometry::primitives::Rect;
5use rand::Rng;
6use rand_distr::Distribution;
7use rand_distr::Uniform;
8
9/// Samples a [`DTransformation`] uniformly at random in a given [`Rect`] and [`UniformRotDistr`].
10pub struct UniformRectSampler {
11    pub bbox: Rect,
12    pub uniform_x: Uniform<f32>,
13    pub uniform_y: Uniform<f32>,
14    pub uniform_r: UniformRotDistr,
15}
16
17impl UniformRectSampler {
18    pub fn new(bbox: Rect, item: &Item) -> Self {
19        let uniform_x = Uniform::new(bbox.x_min, bbox.x_max).unwrap();
20        let uniform_y = Uniform::new(bbox.y_min, bbox.y_max).unwrap();
21        let uniform_r = UniformRotDistr::from_item(item);
22        Self {
23            bbox,
24            uniform_x,
25            uniform_y,
26            uniform_r,
27        }
28    }
29
30    pub fn sample(&self, rng: &mut impl Rng) -> DTransformation {
31        let r_sample = self.uniform_r.sample(rng);
32        let x_sample = self.uniform_x.sample(rng);
33        let y_sample = self.uniform_y.sample(rng);
34
35        DTransformation::new(r_sample, (x_sample, y_sample))
36    }
37}