Measure: split triangles that cut through curved faces onto the surface (trimmed faces after booleans were measured up to 15% off; 61's keyway volume now matches); oracle step check shows the original volume
Oracle: 53/66. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01AS5Tn3xieewUSg3uxrMVdL
This commit is contained in:
1 parent
063d55bdb3
commit
8c88fb8d2d
5 files changed
+164
-7
No files matched your search
@@ -79,13 +79,13 @@ pub fn measure(b: &Body) -> Result<BodyMeasure> {
|
||||
});
|
||||
}
|
||||
let size = b.size();
|
||||
let coarse = b.tessellate((size * 1e-3).max(1e-3))?;
|
||||
let coarse = b.tessellate_with((size * 1e-3).max(1e-3), true)?;
|
||||
// Chord error relative to a radius sets the volume error: keep it near 3e-4 of the
|
||||
// smallest radius (thin tubes, small fillets).
|
||||
let tight = min_edge_radius(&coarse).map(|r| r * 3e-4).unwrap_or(f64::INFINITY);
|
||||
let fine_tol = (size * 5e-5).min(tight).max(size * 5e-6).max(1e-4);
|
||||
let fine = b.tessellate(fine_tol)?;
|
||||
let medium = b.tessellate((fine_tol * 5.0).max(2e-4))?;
|
||||
let fine = b.tessellate_with(fine_tol, true)?;
|
||||
let medium = b.tessellate_with((fine_tol * 5.0).max(2e-4), true)?;
|
||||
let nf = b.face_count();
|
||||
let (sf, sm, sc) = (face_sums(&fine, nf), face_sums(&medium, nf), face_sums(&coarse, nf));
|
||||
let close = |x: f64, y: f64| (x - y).abs() <= 0.01 * x.abs().max(y.abs()) + 1e-9;
|
||||
@@ -114,6 +114,6 @@ pub fn measure(b: &Body) -> Result<BodyMeasure> {
|
||||
edges: b.edge_count(),
|
||||
vertices: b.vertex_count(),
|
||||
shells: b.shell_count(),
|
||||
merged: merged_topology(b, &coarse)?,
|
||||
merged: merged_topology(b, &b.tessellate((size * 1e-3).max(1e-3))?)?,
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user