use crate::file::metadata::HeapSize;
#[derive(Clone, Debug, PartialEq)]
pub struct BoundingBox {
x_range: (f64, f64),
y_range: (f64, f64),
z_range: Option<(f64, f64)>,
m_range: Option<(f64, f64)>,
}
impl BoundingBox {
pub fn new(xmin: f64, xmax: f64, ymin: f64, ymax: f64) -> Self {
Self {
x_range: (xmin, xmax),
y_range: (ymin, ymax),
z_range: None,
m_range: None,
}
}
pub fn with_xrange(mut self, xmin: f64, xmax: f64) -> Self {
self.x_range = (xmin, xmax);
self
}
pub fn with_yrange(mut self, ymin: f64, ymax: f64) -> Self {
self.y_range = (ymin, ymax);
self
}
pub fn with_zrange(mut self, zmin: f64, zmax: f64) -> Self {
self.z_range = Some((zmin, zmax));
self
}
pub fn with_mrange(mut self, mmin: f64, mmax: f64) -> Self {
self.m_range = Some((mmin, mmax));
self
}
pub fn get_xmin(&self) -> f64 {
self.x_range.0
}
pub fn get_xmax(&self) -> f64 {
self.x_range.1
}
pub fn get_ymin(&self) -> f64 {
self.y_range.0
}
pub fn get_ymax(&self) -> f64 {
self.y_range.1
}
pub fn get_zmin(&self) -> Option<f64> {
self.z_range.map(|z| z.0)
}
pub fn get_zmax(&self) -> Option<f64> {
self.z_range.map(|z| z.1)
}
pub fn get_mmin(&self) -> Option<f64> {
self.m_range.map(|m| m.0)
}
pub fn get_mmax(&self) -> Option<f64> {
self.m_range.map(|m| m.1)
}
pub fn is_z_valid(&self) -> bool {
self.z_range.is_some()
}
pub fn is_m_valid(&self) -> bool {
self.m_range.is_some()
}
}
impl HeapSize for BoundingBox {
fn heap_size(&self) -> usize {
0 }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bounding_box() {
let bbox = BoundingBox::new(0.0, 0.0, 10.0, 10.0);
assert_eq!(bbox.get_xmin(), 0.0);
assert_eq!(bbox.get_xmax(), 0.0);
assert_eq!(bbox.get_ymin(), 10.0);
assert_eq!(bbox.get_ymax(), 10.0);
assert_eq!(bbox.get_zmin(), None);
assert_eq!(bbox.get_zmax(), None);
assert_eq!(bbox.get_mmin(), None);
assert_eq!(bbox.get_mmax(), None);
assert!(!bbox.is_z_valid());
assert!(!bbox.is_m_valid());
let bbox_z = BoundingBox::new(0.0, 0.0, 10.0, 10.0).with_zrange(5.0, 15.0);
assert_eq!(bbox_z.get_zmin(), Some(5.0));
assert_eq!(bbox_z.get_zmax(), Some(15.0));
assert!(bbox_z.is_z_valid());
assert!(!bbox_z.is_m_valid());
let bbox_m = BoundingBox::new(0.0, 0.0, 10.0, 10.0).with_mrange(10.0, 20.0);
assert_eq!(bbox_m.get_mmin(), Some(10.0));
assert_eq!(bbox_m.get_mmax(), Some(20.0));
assert!(!bbox_m.is_z_valid());
assert!(bbox_m.is_m_valid());
let bbox_zm = BoundingBox::new(0.0, 0.0, 10.0, 10.0)
.with_zrange(5.0, 15.0)
.with_mrange(10.0, 20.0);
assert_eq!(bbox_zm.get_zmin(), Some(5.0));
assert_eq!(bbox_zm.get_zmax(), Some(15.0));
assert_eq!(bbox_zm.get_mmin(), Some(10.0));
assert_eq!(bbox_zm.get_mmax(), Some(20.0));
assert!(bbox_zm.is_z_valid());
assert!(bbox_zm.is_m_valid());
}
}