Skip to content

CC-NEST-ANNULUS: stamp mixed nest; lock two-arc disc as D4 - #15

Open
grootstebozewolf wants to merge 1 commit into
cursor/d5-annulus-tangent-d7aafrom
cursor/cc-nest-annulus-0a09
Open

CC-NEST-ANNULUS: stamp mixed nest; lock two-arc disc as D4#15
grootstebozewolf wants to merge 1 commit into
cursor/d5-annulus-tangent-d7aafrom
cursor/cc-nest-annulus-0a09

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on cursor/d5-annulus-tangent-d7aa @ 7370303 (draft PR #13). Does not merge #12, #13, or #7. Does not push to feature/sfa-curve-rgr or master.

Sentence

Every circular pair that has a closed form has a kit. Everything else is a named miss and the chordsaw. We will not write a circular noder in this PR.

Choice: stamp, plus a D4 lock

CC-NEST-ANNULUS is a named green null, not a laser. Kit if both operands certify as discs; else stamp. No noder was written.

Stamp (this cell)

Fixture: horizontal stadium |x|≤2, |y|≤1 strictly inside CIRCLE_5.

CURVEPOLYGON (COMPOUNDCURVE (
  CIRCULARSTRING (-1 -1, -2 0, -1 1), (-1 1, 1 1),
  CIRCULARSTRING (1 1, 2 0, 1 -1), (1 -1, -1 -1)))

Not a re-run of CIRCLE_5 \\ CIRCLE_3, not H-ANNULUS-TANGENT, not HALF_SMALL. Mixed CompoundCurve (arcs + segments). 0 nodes.

Why every kit misses:

  • R1.5 / D4: stadium is not a disc (centreRadius is null)
  • R1.6: stadium is not a plain polygon
  • R1.7 clip() is two-node only, so a 0-node nest returns null
  • TwoShellClip never runs: only one operand is a mixed CompoundCurve shell

assertNull("CC-NEST-ANNULUS: …") on CircularDiscOverlay and CompoundCurveShellOverlay. Public SUB may chordsaw; that path is approximate, not a laser. Do not punch a stadium-in-disc hole.

Kit lock (already D4)

A CompoundCurve of two semicircle arcs vs CIRCLE_5 both certify via CircularDiscOverlay.centreRadius. That pair already takes nestedAnnulus. This PR does not invent a new noder or a general CompoundCurve annulus. It adds a kit-level assertNotNull plus CAP/CUP/SUB/XOR exactness (area 16π, isApproximate()=false) so the two-arc encoding cannot silently become R2.

Out of scope

  • No new public API
  • No circular noder
  • No P2.1 / N-SS / P2.5
  • No densify-as-laser
  • Slack stays 15%

Verify

mvn -pl modules/curve -am test -DfailIfNoTests=false -Dcheckstyle.skip=true -Dpmd.skip=true \
  -Dtest=CompoundCurveShellOverlayTest,CircularArcOverlayTest,CircularDiscOverlayTest,CircularDiscPolygonOverlayTest,OverlayNGCurvePhase0Test,OverlayNGCurveRatchetTest,OverlayNGCurvePerfGateTest
bash dev/check-no-curved.sh
mvn -pl modules/curve checkstyle:check
mvn -pl modules/curve pmd:check

All green after this revision:

  • CompoundCurveShellOverlayTest 24 / 0 (CC-NEST-ANNULUS stamp on R1.7)
  • CircularArcOverlayTest 11 / 0 (same named null)
  • CircularDiscOverlayTest 12 / 0 (D4 two-arc lock + CC-NEST-ANNULUS stamp + H-ANNULUS-TANGENT)
  • CircularDiscPolygonOverlayTest 7 / 0
  • OverlayNGCurvePhase0Test 19 / 0
  • OverlayNGCurveRatchetTest 44 / 0 (covers two-arc disc is EEEE)
  • OverlayNGCurvePerfGateTest 78 / 0 (15% slack)
  • mvn -pl modules/curve test: 589 tests, 0 failures
  • Naming-guard OK; Checkstyle 0 violations; PMD check on jts-curve succeeded
Open in Web Open in Cursor 

A mixed stadium nested in CIRCLE_5 is not two certified discs.
D4 and R1.7 stay null. A two-arc CompoundCurve disc already
certifies and keeps the existing nested-annulus kit.

Co-authored-by: Jeroen Bloemscheer <grootstebozewolf@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants