M2: loft (arc-length ruled sections) and sweep along sketch paths; three-level measurement voting

Oracle: 23/29 parts match Fusion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bherbruckandClaude Opus 5.5 committed 2026-10-07 19:22:27 +00:00
1 parent 73a1ab40d0
commit c555f6f693
11 files changed
+446 -6

No files matched your search

+12 -4
View File
@@ -40,13 +40,21 @@ fn face_sums(m: &Mesh, nf: usize) -> Vec<(f64, f64, Vec3)> {
pub fn measure(b: &Body) -> Result<BodyMeasure> {
let size = b.size();
let fine = b.tessellate((size * 5e-5).max(1e-4))?;
let medium = b.tessellate((size * 2.5e-4).max(2e-4))?;
let coarse = b.tessellate((size * 1e-3).max(1e-3))?;
let nf = b.face_count();
let (sf, sc) = (face_sums(&fine, nf), face_sums(&coarse, nf));
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;
let (mut area, mut v6, mut mom) = (0.0, 0.0, Vec3::ZERO);
for (f, c) in sf.iter().zip(&sc) {
let bad = (f.0 - c.0).abs() > 0.01 * c.0.max(f.0) + 1e-9;
let pick = if bad { c } else { f };
for ((f, m), c) in sf.iter().zip(&sm).zip(&sc) {
// Trust the finest tessellation that agrees with the next coarser one.
let pick = if close(f.0, m.0) {
f
} else if close(m.0, c.0) {
m
} else {
f
};
area += pick.0;
v6 += pick.1;
mom += pick.2;