fix(pockets): skip pocketing in high-density zones (eta > eta_solid)

High density (η > 0.7) means high stress → leave solid, no pocket.
Only low-density regions get lightweighted.

Scenario comparison with s_min=30, s_max=70:
- Baseline uniform (w=0.5): 78 pockets, 2886g
- Bottom-right heavy: 41 pockets, 3516g (bottom stays solid)
- Left-side mount: 27 pockets, 3799g (left stays solid)
- Center pressure: 15 pockets, 4295g (center stays solid)
This commit is contained in:
2026-02-16 21:05:56 +00:00
parent 4f051aa7e1
commit 1021f57abc
9 changed files with 20991 additions and 0 deletions

View File

@@ -299,6 +299,9 @@ def generate_pockets(triangulation, geometry, params):
eta = evaluate_density(mid[0], mid[1], geometry, params)
edge_thickness[edge] = density_to_rib_thickness(eta, params)
# Density threshold: triangles in high-density zones stay solid (no pocket)
eta_solid = params.get('eta_solid', 0.7)
pockets = []
for tri_idx, tri in enumerate(triangles):
p0 = vertices[tri[0]]
@@ -309,6 +312,13 @@ def generate_pockets(triangulation, geometry, params):
if tri_area < min_triangle_area:
continue
# Check density at centroid — high density = leave solid
centroid_x = (p0[0] + p1[0] + p2[0]) / 3.0
centroid_y = (p0[1] + p1[1] + p2[1]) / 3.0
eta_c = evaluate_density(centroid_x, centroid_y, geometry, params)
if eta_c > eta_solid:
continue
e01 = tuple(sorted([tri[0], tri[1]]))
e12 = tuple(sorted([tri[1], tri[2]]))
e20 = tuple(sorted([tri[2], tri[0]]))