#[cfg(test)]
mod test;
mod adaptive;
mod triangles;
mod uniform;
use crate::{
geometry::mesh::Mesh,
math::{Quantity, Scalar},
units::Length,
};
const D: usize = 3;
pub struct Remeshing {
pub iterations: usize,
pub metric: RemeshingMetric,
}
pub enum RemeshingMetric {
Isotropic(IsotropicSizing),
Anisotropic(AnisotropicSizing),
}
pub enum IsotropicSizing {
Uniform { length: Option<Quantity<Length>> },
Adaptive {
tolerance: Quantity<Length>,
minimum: Quantity<Length>,
maximum: Quantity<Length>,
gradation: Scalar,
},
}
pub enum AnisotropicSizing {
Uniform,
Adaptive,
}
impl Mesh<D> {
pub fn remesh(self, remeshing: Remeshing) -> Result<Self, &'static str> {
let Remeshing { iterations, metric } = remeshing;
match metric {
RemeshingMetric::Isotropic(sizing) => match sizing {
IsotropicSizing::Uniform { length } => self.uniform_remesh(iterations, length),
IsotropicSizing::Adaptive {
tolerance,
minimum,
maximum,
gradation,
} => self.adaptive_remesh(iterations, tolerance, minimum, maximum, gradation),
},
RemeshingMetric::Anisotropic(_) => Err("anisotropic remeshing is not implemented yet"),
}
}
}