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]]))

View File

@@ -0,0 +1,8 @@
{
"s_min": 30.0,
"s_max": 70.0,
"R_0": 50.0,
"alpha": 1.5,
"beta": 0.4,
"adaptive_density": false
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff