diff --git a/src/lib.rs b/src/lib.rs index 97cccc9..918e04d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ pub mod integrators; pub mod materials; pub mod math; pub mod mesh; +pub mod random_distributions; pub mod raycasting; pub mod realtype; pub mod sampler; diff --git a/src/random_distributions/mod.rs b/src/random_distributions/mod.rs new file mode 100644 index 0000000..0df18b3 --- /dev/null +++ b/src/random_distributions/mod.rs @@ -0,0 +1,6 @@ +mod uniform_square; +pub use uniform_square::UniformSquare; + +pub trait RandomDistribution { + fn value(&self) -> T; +} diff --git a/src/random_distributions/uniform_square.rs b/src/random_distributions/uniform_square.rs new file mode 100644 index 0000000..e915c5c --- /dev/null +++ b/src/random_distributions/uniform_square.rs @@ -0,0 +1,37 @@ +use rand::distributions::Open01; +use rand::{thread_rng, Rng}; + +use crate::math::Vec2; + +use super::RandomDistribution; + +#[derive(Debug)] +pub struct UniformSquare { + corner: Vec2, + size: f64, +} + +impl RandomDistribution for UniformSquare { + fn value(&self) -> Vec2 { + let mut rng = thread_rng(); + self.corner + + Vec2::new(rng.sample::(Open01), rng.sample::(Open01)) * self.size + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn print_values() { + let target = UniformSquare { + corner: Vec2::new(1.5, -2.5), + size: 3.0, + }; + for _ in 0..1000 { + let value = target.value(); + println!("{}, {}", value.x(), value.y()); + } + } +}