Add UniformHemisphere random distribution

This commit is contained in:
Matthew Gordon 2021-10-04 08:14:16 -04:00
parent 41cc032bed
commit 8badbaa3ca
2 changed files with 51 additions and 0 deletions

View File

@ -4,6 +4,9 @@ pub use uniform_square::UniformSquare;
mod unit_disc; mod unit_disc;
pub use unit_disc::UnitDisc; pub use unit_disc::UnitDisc;
mod uniform_hemisphere;
pub use uniform_hemisphere::UniformHemisphere;
pub trait RandomDistribution<T> { pub trait RandomDistribution<T> {
fn value(&self) -> T; fn value(&self) -> T;
} }

View File

@ -0,0 +1,48 @@
use rand::distributions::{Open01, OpenClosed01};
use rand::{thread_rng, Rng};
use crate::math::Vec3;
use super::RandomDistribution;
pub struct UniformHemisphere {}
impl UniformHemisphere {
pub fn new() -> UniformHemisphere {
UniformHemisphere {}
}
}
impl RandomDistribution<Vec3> for UniformHemisphere {
fn value(&self) -> Vec3 {
let mut rng = thread_rng();
let mut result = Vec3::new(
2.0 * rng.sample::<f64, _>(Open01) - 1.0,
2.0 * rng.sample::<f64, _>(Open01) - 1.0,
rng.sample::<f64, _>(OpenClosed01),
);
while result.norm_squared() > 1.0 {
result = Vec3::new(
2.0 * rng.sample::<f64, _>(Open01) - 1.0,
2.0 * rng.sample::<f64, _>(Open01) - 1.0,
rng.sample::<f64, _>(OpenClosed01),
);
}
result.normalize()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[ignore]
fn print_values() {
let target = UniformHemisphere::new();
for _ in 0..1000 {
let value = target.value();
println!("{}, {}, {}", value.x(), value.y(), value.z());
}
}
}