use crate::topology::{BrepSolid, EdgeRecord, FaceRecord, ShellRecord};
use crate::{NurbsCurve, NurbsSurface, Vec3};
use serde::Serialize;
const GAUSS_X: [f64; 8] = [
-0.9602898564975363,
-0.7966664774136267,
-0.525532409916329,
-0.18343464249564978,
0.18343464249564978,
0.525532409916329,
0.7966664774136267,
0.9602898564975363,
];
const GAUSS_W: [f64; 8] = [
0.10122853629037669,
0.22238103445337445,
0.31370664587788727,
0.362683783378362,
0.362683783378362,
0.31370664587788727,
0.22238103445337445,
0.10122853629037669,
];
#[derive(Clone, Copy)]
enum Integrand {
Area,
Volume,
VolumeAbout(Vec3),
MomentX,
MomentY,
MomentZ,
SecondXX,
SecondYY,
SecondZZ,
ProductXY,
ProductXZ,
ProductYZ,
}
#[derive(Clone, Copy, Debug, Serialize)]
pub struct MassProperties {
pub surface_area: f64,
pub volume: f64,
}
#[derive(Clone, Copy, Debug, Serialize)]
pub struct FullMassProperties {
pub surface_area: f64,
pub volume: f64,
pub centroid: Vec3,
pub inertia: [[f64; 3]; 3],
pub principal_moments: [f64; 3],
pub principal_axes: [[f64; 3]; 3],
}
#[derive(Clone, Copy, Debug, Serialize)]
pub struct DensityMassProperties {
pub density: f64,
pub mass: f64,
pub surface_area: f64,
pub volume: f64,
pub centroid: Vec3,
pub inertia: [[f64; 3]; 3],
pub principal_moments: [f64; 3],
pub principal_axes: [[f64; 3]; 3],
}
impl FullMassProperties {
pub fn with_density(&self, density: f64) -> DensityMassProperties {
let scale = |matrix: [[f64; 3]; 3]| {
let mut out = [[0.0f64; 3]; 3];
for row in 0..3 {
for column in 0..3 {
out[row][column] = density * matrix[row][column];
}
}
out
};
DensityMassProperties {
density,
mass: density * self.volume,
surface_area: self.surface_area,
volume: self.volume,
centroid: self.centroid,
inertia: scale(self.inertia),
principal_moments: [
density * self.principal_moments[0],
density * self.principal_moments[1],
density * self.principal_moments[2],
],
principal_axes: self.principal_axes,
}
}
}
#[path = "mass_properties/integration.rs"]
mod integration;
#[path = "mass_properties/measures.rs"]
mod measures;
#[path = "mass_properties/polygons.rs"]
mod polygons;
#[path = "mass_properties/solid_props.rs"]
mod solid_props;
#[path = "mass_properties/trimmed.rs"]
mod trimmed;
#[path = "mass_properties/winding.rs"]
mod winding;
use integration::*;
use measures::*;
use polygons::*;
use trimmed::*;
pub use integration::parameter_space_area;
pub use measures::{
curve_arc_length, edge_arc_length, face_area, face_boundary_length,
face_volume_contribution, solid_edge_length_total,
};
pub use solid_props::{solid_mass_properties, solid_mass_properties_full, solid_signed_volume};
pub(crate) use solid_props::shell_signed_volume;
pub use polygons::trim_polygons;