Skip to content

Commit 3d3fce1

Browse files
TMHSDigitalclaude
andcommitted
docs(showcase): record the mirror-symmetry and wrapper-seating conventions
Three conventions every future piece inherits, each from a defect the hay-bale pass found that no existing budget could see. Even shaping terms and mirror symmetry (19): where a prop has mirrored members, every closed-form term in the host's shaping function must be even in the mirrored axis. hay-bale used sin(x*24), which is odd, so its two belt stations sampled different surface heights and the wraps shipped 5.4 mm out of step. Pair the mirrored shells and compare. Wrappers follow the host's profile, and the host is finished first (16/18): build, bevel and ground the host, then hang the wrapper on the finished surface by raycasting the host's own cross-section. A constant rectangle on a rounded host stands proud at the middle of each face and is swallowed at the corners. Assert per wrapper shell that the loop passes under the host, because the AABB zmin gate stays green when the host grounds the box. Seat depth is measured station-locally, along the vertex's own direction from the station axis, never by nearest-surface distance: a wrapper in a concave waist has its nearest host face on the bulge shoulder at a neighbouring station. Bin by rounding to the nearest station, never by flooring, or a station on a bin boundary splits its inner and outer rings and the inner-only bin reports the outer offset as the seat depth. Also sharpens the z-fight budget: count coplanar pairs cross-shell, not merely over faces sharing no vertex. Two quads two steps apart on one flat cap share no vertex and are coplanar by construction -- that read 96 pairs on hay-bale, none of them a hazard, which is the same unsatisfiable-budget trap the surrounding paragraph already warns about. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent c5fe066 commit 3d3fce1

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

‎showcase/README.md‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ entry in `showcase/gallery.json`, and a rendered still.
6565
the last one over faces that share **no** vertex: the triangles of one
6666
flat fan cap are coplanar and close-centred by construction, and
6767
counting those makes the budget unsatisfiable rather than meaningful.
68+
Count the coplanar pairs **cross-shell**, not merely over faces that
69+
share no vertex: two quads two steps apart on one flat cap share no
70+
vertex and are coplanar and close-centred by construction. Counting
71+
those reported 96 pairs on `hay-bale`, none of them a hazard, which is
72+
the same unsatisfiable-budget trap in a second disguise. Z-fighting is
73+
two separate bodies landing on one plane, and that is a cross-shell
74+
pair by definition.
6875
Multi-body props do **not** require Euler characteristic 2 — that is a
6976
single-shell contract. Two boxes that share a coplanar face z-fight;
7077
two that share a vertex weld into one shell. Seat a joint with a named
@@ -100,6 +107,26 @@ entry in `showcase/gallery.json`, and a rendered still.
100107
hypot-length box rotated about its centroid. The centroid form is
101108
short of one host and punches through the other. `--short-brace` /
102109
`--float-spout` (or the piece's equivalent) is the falsifier.
110+
- **Even shaping terms and mirror symmetry (exit 19).** Where a prop has
111+
mirrored members — two belts, two brackets, a pair of feet — every
112+
closed-form term in the host's shaping function must be **even** in
113+
the mirrored axis. `hay-bale` used `sin(x*24)`, which is odd, so its
114+
two belt stations sampled different surface heights and the wraps
115+
shipped 5.4 mm out of step; `cos` fixed it exactly. Assert it: pair the
116+
mirrored shells and compare their axis positions and extents within a
117+
named epsilon. A bounding box cannot see this, and neither can a
118+
per-member budget that only ever looks at one member.
119+
- **Wrappers follow the host's profile, and the host is finished first
120+
(exit 16/18).** Build, bevel and **ground the host, then** hang the
121+
wrapper on the finished surface by raycasting the host's own
122+
cross-section at the wrapper's station. Placing a wrapper against
123+
half-built geometry and shifting everything afterwards leaves each one
124+
a different distance off the floor. A constant-section rectangle on a
125+
rounded host stands proud at the middle of each face and is swallowed
126+
at the corners — `hay-bale`'s belts stopped 2.9–8.3 mm above the floor
127+
with a visible notch, while the AABB `zmin` gate stayed green because
128+
the loaf grounded the box. Assert **per wrapper shell** that the loop
129+
passes under the host, not just that something touches Z=0.
103130
- **Seat conformance (exit 18).** A band, hoop, strap or collar wrapped
104131
around a host asserts a **banded** seat depth — a minimum so it cannot
105132
float and a maximum so it cannot sink — sampled per angular segment
@@ -110,6 +137,14 @@ entry in `showcase/gallery.json`, and a rendered still.
110137
vertices as inner ones the moment the host is out of round, which is
111138
how a hoop that visibly gapped on one side still passed. The paired
112139
falsifier makes the wrapper a true circle on an out-of-round host.
140+
Measure the depth **station-locally**, along the vertex's own direction
141+
from the station axis — not by nearest-surface distance. A wrapper
142+
seated in a concave waist has its nearest host face on the bulge
143+
shoulder at a neighbouring station, and the wrap then reads as sitting
144+
10 mm outside a host it is in fact hugging. Bin the samples by
145+
**rounding** to the nearest station, never by flooring: a station on a
146+
bin boundary puts its inner and outer rings in different bins, and the
147+
inner-only bin reports the wrapper's outer offset as its seat depth.
113148
- **Level sole on a raked leg (exit 18).** A raked stile does not sit
114149
in a world-axis cube. Build the sleeve in the member frame so it
115150
follows the rake; add the tread after the rake as its own

0 commit comments

Comments
 (0)