Skip to content

P2.5.6 H-SHELL-N-MIXED overlay kit (Option C, OV-P2 / Bar 2) - #37

Open
grootstebozewolf wants to merge 1 commit into
cursor/p254-tangent-stamp-917cfrom
cursor/p256-mixed-overlay-17ab
Open

P2.5.6 H-SHELL-N-MIXED overlay kit (Option C, OV-P2 / Bar 2)#37
grootstebozewolf wants to merge 1 commit into
cursor/p254-tangent-stamp-917cfrom
cursor/p256-mixed-overlay-17ab

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on #25 (cursor/p254-tangent-stamp-917c @ 8d1546a). OV-P2 / Bar 2. Option C only. Do not stack on #27 (OverlayNG-for-circles / public SegmentKind is a dead-end draft). Do not merge this into #7. Does not merge #12 / #13 / #15 / #16 / #17 / #18 / #19 / #20 / #23 / #24 / #25 / #7. Does not push to feature/sfa-curve-rgr or master.

Sentence

P2.1–P2.5.4 climbed. N-SS is locked to Option C (CurveSegmentString in jts-curve, 0 core SegmentString edits). The noder already named MIXED as an edge (P2.2 / #17): H-SHELL-N-MIXED diameter (-1 0)–(1 0). Overlay still assertNull. This rung consumes that named edge and returns exact CAP / CUP / SUB / XOR.

Assembly rule

Shared-edge walk, not a discrete node pair. CurveSegmentNoder.nodes stays null (the overlap is an interval). edges names the chord. MixedOverlapOverlay walks each hole-free CompoundCurve shell from the run's ends, treats the overlap walk as the shared edge, and classifies the rest walk as entirely IN or entirely OUT. CAP / CUP are the inner / outer shells. SUB / XOR splice the two rests into a bite on the diameter (not a punch). A rest that weaves in and out (collinear overlap plus a hidden crossing) stays null. Nested / crossing half-discs stay on HalfDiscOverlay.

The arrangement-walk-on-null-nodes hypothesis was checked and not used as a general faces path: nodes==null can hide a real crossing that the collinear pair aborted (HALF_DISC × HALF_CROSSING_UPPER). The certified rest-walk is the closed form. No snap-rounding, no core SegmentString / HotPixel / noding.snapround, no densify-then-overlay flagged exact.

Not this rung (existing named nulls, unchanged):

  • H-ANNULUS-TANGENT / CIRCLE_INT_TAN — P2.2 pinch
  • TOUCH-ext — P2.2 kiss
  • R-LL collinear — lineal, not this kit
  • H-SHELL-HOLE-X / holed Geometry — P2.3/P2.4
  • P2.5.4 TANGENT_LEAVE_ANGLE — N≥3 near-tangent stamp

Cells

Cell Product
N=2 pair-kit lasers (R1.5, even-n, ODD, HOLE-*, H-SAME-CIRCLE) unchanged laser; isApproximate()=false
P2.5.4 HALF_DISC × HALF_HANGING × STADIUM_ODD unchanged named stamp TANGENT_LEAVE_ANGLE
H-SHELL-N-MIXED (HALF_DISC × ON_DIAMETER) this rung: exact CAP/CUP/SUB/XOR; SUB/XOR is a shell bite, not a hole

Pins

  • isApproximate()=false on MIXED CAP/CUP/SUB/XOR. A chordsaw fallback fails that assert.
  • Areas: CAP = 2 + π/2, CUP = 12.5π, SUB/XOR = 12.5π − 2 − π/2, reverse SUB empty.
  • P2.1–P2.5.4 pins stay bit-identical.
  • Slack 15%. OverlayNGCurve never Curved. Java 8, Checkstyle, PMD (AvoidBranchingStatementAsLastInLoop).
  • No new public API. Package-private in org.locationtech.jts.operation.overlayng.curve.
  • No circular noder in jts-core. No Option B SegmentKind. No createCompoundCurve(CoordinateSequence) polyline lie.

What this is not

Verify

mvn -pl modules/curve -am test -DfailIfNoTests=false -Dcheckstyle.skip=true -Dpmd.skip=true \
  -Dtest=CurveSegmentStringTest,CompoundCurveShellOverlayTest,CircularArcOverlayTest,CircularDiscOverlayTest,CircularDiscPolygonOverlayTest,CircularLineOverlayTest,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:

  • CurveSegmentStringTest 24 / 0 (MIXED overlay + pair-kit faces; pinch / kiss / holed / P2.5.4 stamp unchanged)
  • CompoundCurveShellOverlayTest 28 / 0 (testMixedOverlapIsSharedEdgeBite is the new laser)
  • CircularArcOverlayTest 11 / 0
  • CircularDiscOverlayTest 12 / 0
  • CircularDiscPolygonOverlayTest 7 / 0
  • CircularLineOverlayTest 7 / 0
  • OverlayNGCurvePhase0Test 19 / 0
  • OverlayNGCurveRatchetTest 50 / 0
  • OverlayNGCurvePerfGateTest 84 / 0 at 15% slack (MIXED CAP + SUB added)
  • bash dev/check-no-curved.sh OK
  • Checkstyle 0 / PMD clean on jts-curve
Open in Web Open in Cursor 

Option C: consume the P2.2 MIXED interval as a shared edge and
return exact CAP/CUP/SUB/XOR. Nodes stay null; the rest-walk of
each shell is IN or OUT. SUB/XOR are a bite on the diameter, not
a punch. Nested/crossing half-discs stay on HalfDiscOverlay.

Co-authored-by: Jeroen Bloemscheer <grootstebozewolf@users.noreply.github.com>
@grootstebozewolf
grootstebozewolf marked this pull request as ready for review August 16, 2026 12:49
grootstebozewolf added a commit that referenced this pull request Aug 16, 2026
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