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:
bherbruckandClaude Opus 5.5 committed 2026-10-08 02:48:17 +00:00
1 parent 063d55bdb3
commit 8c88fb8d2d
5 files changed
+164 -7

No files matched your search

+4 -4
View File
@@ -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))?)?,
})
}