pub mod wall_2d;
pub mod wall_3d;
pub const WALL_ID_MAX: i32 = -1000;
pub struct Wall<const D: usize> {
id: i32,
inner: Box<dyn WallGeometry<D>>,
}
impl<const D: usize> Wall<D> {
pub fn new(id: i32, geometry: Box<dyn WallGeometry<D>>) -> Self {
if id > WALL_ID_MAX {
panic!("Wall ID must be <= {}", WALL_ID_MAX);
}
Self {
id,
inner: geometry,
}
}
pub fn id(&self) -> i32 {
self.id
}
pub fn contains(&self, point: &[f64; D]) -> bool {
self.inner.contains(point)
}
pub fn cut(&self, generator: &[f64; D], callback: &mut dyn FnMut([f64; D], [f64; D])) {
self.inner.cut(generator, callback)
}
pub fn is_planar(&self) -> bool {
self.inner.is_planar()
}
}
pub trait WallGeometry<const D: usize>: Send + Sync + std::fmt::Debug {
fn contains(&self, point: &[f64; D]) -> bool;
fn cut(&self, generator: &[f64; D], callback: &mut dyn FnMut([f64; D], [f64; D]));
fn is_planar(&self) -> bool {
false
}
}