use crate::errors::SphericalCowError as Error;
use crate::shapes::Sphere;
use crate::Container;
#[derive(PartialEq, Debug, Clone)]
pub struct Cuboid {
pub half_extents: Vec<f32>,
}
impl Cuboid {
pub fn new(extent_x: f32, extent_y: f32, extent_z: f32) -> Result<Cuboid, Error> {
if extent_x <= 0.0 || extent_y <= 0.0 || extent_z <= 0.0 {
Err(Error::NegativeExtents)
} else {
Ok(Cuboid {
half_extents: vec![extent_x, extent_y, extent_z],
})
}
}
pub fn from_vec(half_extents: Vec<f32>) -> Result<Cuboid, Error> {
if half_extents.iter().any(|he| *he <= 0.0) {
Err(Error::NegativeExtents)
} else {
Ok(Cuboid { half_extents })
}
}
}
impl Container for Cuboid {
fn contains(&self, sphere: &Sphere) -> bool {
self.half_extents
.iter()
.zip(sphere.center.coords.iter())
.all(|(extent, sphere_extent)| sphere_extent.abs() + sphere.radius <= *extent)
}
fn volume(&self) -> f32 {
self.half_extents
.iter()
.map(|half_extent| 2. * half_extent)
.product()
}
}