use super::*;
fn box_mesh(center: [f64; 3], half: [f64; 3]) -> Mesh {
let (cx, cy, cz) = (center[0], center[1], center[2]);
let (hx, hy, hz) = (half[0], half[1], half[2]);
let verts: [[f64; 3]; 8] = [
[cx - hx, cy - hy, cz - hz],
[cx + hx, cy - hy, cz - hz],
[cx + hx, cy + hy, cz - hz],
[cx - hx, cy + hy, cz - hz],
[cx - hx, cy - hy, cz + hz],
[cx + hx, cy - hy, cz + hz],
[cx + hx, cy + hy, cz + hz],
[cx - hx, cy + hy, cz + hz],
];
let mut m = Mesh::new();
for v in verts {
m.positions.push(v[0] as f32);
m.positions.push(v[1] as f32);
m.positions.push(v[2] as f32);
}
m.indices = vec![
0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 0, 1, 5, 0, 5, 4, 3, 2, 6, 3, 6, 7, 0, 4, 7, 0, 7, 3, 1, 5, 6, 1, 6, 2, ];
m
}
fn push_sliver_triangle(m: &mut Mesh) {
let a = [50.0_f64, 60.0, 12.5];
let b = [53.0_f64, 63.0, 15.5]; let c = [56.0_f64, 66.0, 18.501]; let base = (m.positions.len() / 3) as u32;
for v in [a, b, c] {
m.positions.push(v[0] as f32);
m.positions.push(v[1] as f32);
m.positions.push(v[2] as f32);
}
m.indices.extend_from_slice(&[base, base + 1, base + 2]);
}
#[test]
fn sliver_fixture_is_actually_a_sliver() {
let a = [50.0_f64, 60.0, 12.5];
let b = [53.0_f64, 63.0, 15.5];
let c = [56.0_f64, 66.0, 18.501];
let e1 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];
let e2 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
let cross = cross3(e1, e2);
let cross_len = dot3(cross, cross).sqrt();
let sin_theta = cross_len / (dot3(e1, e1).sqrt() * dot3(e2, e2).sqrt());
assert!(
cross_len > 0.0 && cross_len < 1e-2,
"cross magnitude out of the intended sliver range: {cross_len}"
);
assert!(
sin_theta < MIN_SIN_THETA,
"sin theta {sin_theta} is not below MIN_SIN_THETA — fixture is not a sliver"
);
assert!(
face_normal(a, b, c).is_none(),
"face_normal should reject this sliver"
);
}
#[test]
fn small_box_yields_three_orthogonal_axes() {
let m = box_mesh([0.0, 0.0, 0.0], [0.0002, 0.0002, 0.0002]);
let axes = orthogonal_face_axes(&m);
assert!(
axes.is_some(),
"sub-millimetre box should still yield 3 orthogonal face axes"
);
let axes = axes.unwrap();
for i in 0..3 {
for j in (i + 1)..3 {
assert!(
dot3(axes[i], axes[j]).abs() <= ORTHO_EPS,
"axes {i} and {j} are not orthogonal: dot = {}",
dot3(axes[i], axes[j])
);
}
}
}
#[test]
fn sliver_triangle_does_not_displace_real_box_axes() {
let mut m = box_mesh([1000.0, 500.0, 20.0], [2.0, 1.5, 1.0]);
push_sliver_triangle(&mut m);
let axes = orthogonal_face_axes(&m);
assert!(
axes.is_some(),
"an incidental sliver triangle must not turn a valid box mesh into None"
);
let axes = axes.unwrap();
for i in 0..3 {
for j in (i + 1)..3 {
assert!(
dot3(axes[i], axes[j]).abs() <= ORTHO_EPS,
"axes {i} and {j} are not orthogonal: dot = {}",
dot3(axes[i], axes[j])
);
}
}
}