Mesh: swept cross-sections cut into blocks automatically

A region of an extrusion's (or revolution's) cross-section that no
structured scheme fits is now cut by straight lines into blocks that fit,
before interval assignment, so the cuts are curves of the arrangement and
their counts are assigned with the rest; nothing reaches the model
(hex::decompose, after Tam and Armstrong's medial-axis subdivision and Li,
Armstrong and McKeag's primitives).

Per region: several holes are separated by lines across the gaps between
neighbouring holes; a piece with one hole gets the O-grid layout whose
pieces score best (lines from the outer corners towards the hole or along
their bisectors, from the hole's corners, or along four directions from
the hole); pieces without holes are cut by a two-ply search over lines
from concave corners and fillets and from convex corners. Candidates are
scored by meshing the pieces with their schemes (smallest corner scaled
Jacobian). A region's blocks are kept when fair (at least 0.5) or no worse
than its free mesh, and cuts never end inside a seeded curve.

This replaces the cuts from reflex corners along an edge. Tests on an L,
a T, a plate with a hole, with a slot and with three holes, and the half
crank's cross-section: every region structured, the quads conforming and
the smallest corner scaled Jacobian bounded. The half crank arm now
extrudes in 12 structured regions with a hex20 minimum scaled Jacobian of
0.37 (the arm meeting the bosses 20 degrees off tangent bounds it) where
it had 2 free regions and 0.009.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UhhZMBTviDQxZvwnyP89fo
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-15 01:17:30 -04:00
1 parent a0b4a69452
commit 02172f9a7e
5 files changed
+1384 -100

No files matched your search

+4 -2
View File
@@ -95,8 +95,10 @@ Rules beyond the layer order:
(`fieldcraft-mesh::size`) sets interior sizes and edge divisions, with even counts per loop.
Mapped and swept hex build on these face meshes (`fieldcraft-mesh::hex`, `mesh.hex.generate`):
the B-rep topology is recovered from the face-tagged surface; a body is extruded (straight
multi-level sweep: the levels' outlines imprinted into one cross-section, cut at reflex corners,
regions mapped, O-gridded or free-meshed, then stacked), revolved (the same in a rotating
multi-level sweep: the levels' outlines imprinted into one cross-section, cut automatically
into blocks (holes apart, O-grids, cuts from concave corners and fillets chosen by the quality
of the blocks they leave), regions mapped, triangle primitives, O-gridded or free-meshed, then
stacked), revolved (the same in a rotating
frame), swept one-to-one through rings of linking faces (least-squares affine layers, Roca and
Sarrate 2010), or mapped as a logical cube (Gordon and Thiel 1982); interval assignment
couples the counts of shared curves. Nodes on analytic faces (`Shape::face_surfaces`) are
+20 -2
View File
@@ -1001,8 +1001,8 @@ record or the publisher; the others are cited by venue only.
- **Citation.** M. Whiteley, D. White, S. Benzley, T. Blacker. *Two and three-quarter dimensional meshing
facilitators.* Engineering with Computers 12:144–154, 1996.
- **Use.** Corners by interior angle (≤ 135° end, ≥ 225° reflex); cross-section regions are cut from
their reflex corners to the boundary, which decomposes rectilinear sections into rectangles (an explicit
form of submapping's virtual decomposition), then mapped.
their reflex corners to the boundary (B8.6b), which decomposes rectilinear sections into rectangles (an
explicit form of submapping's virtual decomposition), then mapped.
**B8.6a Midpoint subdivision: Tam and Armstrong 1991; Li, Armstrong, McKeag 1997.** **Verdict: BUILD ON
(triangle primitive).**
@@ -1017,6 +1017,24 @@ record or the publisher; the others are cited by venue only.
shorter than the other two together). The centre is the mean of the split nodes; the interior is then
smoothed (`quad::smooth`) and every quadrilateral checked; a fold falls back to the free mesher.
**B8.6b Automatic cross-section decomposition (medial-axis subdivision).** **Verdict: BUILD ON (blocks
of 2.5D bodies).**
- **Citations.** Tam and Armstrong 1991 (B8.6a): a region is subdivided at its concave features and the
branches of its medial axis into simple primitives. Li, Armstrong, McKeag 1997 (B8.6a): the primitives.
Whiteley et al. 1996 (B8.6): vertex classification.
- **Use.** `hex::decompose` cuts the regions of a multi-level sweep's cross-section that no structured
scheme fits into blocks, before interval assignment (B8.5), so the cuts are curves of the arrangement
and their counts are assigned with the rest; nothing reaches the model. Per region: several holes are
separated by lines across the gaps between neighbouring holes; a piece with one hole gets an O-grid,
the layout (lines from the outer corners towards the hole or along their bisectors, from the hole's
corners, or along four directions from the hole) chosen by the score of its pieces; pieces without
holes are cut by a two-ply search over lines from concave corners and fillets (bisector, edge
extensions, normals of strongly turning curves) and convex corners' bisectors. In place of the
medial axis's geometric rules each candidate is scored by meshing its pieces with their schemes (the
smallest corner scaled Jacobian), preferring fewer free pieces, then less shortfall from 0.9, then
fewer pieces. A region's blocks are kept when fair (≥ 0.5) or no worse than its free mesh; cuts never
end inside a seeded curve.
**B8.7 Gordon and Thiel 1982, trivariate transfinite interpolation.** **Verdict: BUILD ON (mapped blocks).**
- **Citation.** W. J. Gordon, L. C. Thiel. *Transfinite mappings and their application to grid generation.*
Applied Mathematics and Computation 10–11:171–233, 1982.