use axiolid_core::Tolerance;
use axiolid_mesh::TriMesh;
use crate::{
mesh::{second_moments, surface_properties, volume_properties},
MassProperties, Measure, MeshMeasureError,
};
#[derive(Debug, Default, Clone, Copy)]
pub struct MeshMeasure;
impl Measure<TriMesh> for MeshMeasure {
type Error = MeshMeasureError;
fn measure(
&self,
value: &TriMesh,
tolerance: Tolerance,
) -> Result<MassProperties, Self::Error> {
let volume = volume_properties(value, tolerance)?;
let surface = surface_properties(value, tolerance)?;
let second_moment_diagonal = second_moments(value, tolerance)?;
Ok(MassProperties {
area: surface.area,
signed_volume: volume.signed_volume,
centroid: volume.centroid,
second_moment_diagonal,
})
}
}