Skip to content

P2.3 bite vs hole (OV-P2 / Bar 2) - #18

Open
grootstebozewolf wants to merge 1 commit into
cursor/p22-overlap-as-edge-632cfrom
cursor/p23-bite-vs-hole-3909
Open

P2.3 bite vs hole (OV-P2 / Bar 2)#18
grootstebozewolf wants to merge 1 commit into
cursor/p22-overlap-as-edge-632cfrom
cursor/p23-bite-vs-hole-3909

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on cursor/p22-overlap-as-edge-632c @ dd85f92 (draft #17). Do not merge this into #7. This is OV-P2 / Bar 2, not OV-P1. Does not merge #12 / #13 / #15 / #16 / #17 / #7. Does not push to feature/sfa-curve-rgr or master.

Sentence

The noder is the named-miss suite, one assembly rule at a time. Nodes (P2.1), overlap-as-edge (P2.2), then bite vs hole. Densify is never a noder.

What this is

P2.3 is the first face walk, and only this predicate:

If the new edge is a subset of the other shell, it is a bite, not a hole.

H-SHELL-HOLE-CROSS is the fixture: HOLE_STRADDLE vs HALF_RIGHT. The rectangular hole straddles the vertical diameter. Even-n hole ∩ other shares that clip edge (0 1)–(0 2). A punch would guess hole vs bite. This rung walks the P2.1 nodes on the hole ring and certifies the clip edge ⊂ other.shell.

Overlay then splices the bite (CAP / holed SUB) or punches the leftover hole (CUP). Reverse SUB joins the solid leftover with the bite face. XOR is both. Package-private BiteVsHole. Reuses CurveSegmentString, CurveSegmentNoder, SameOuterHoleOverlay, TwoNodeClip. No new public API. No noder in jts-core. Name is OverlayNGCurve.

Bite vs hole vs still-named-miss

Fixture This rung
H-SHELL-HOLE-CROSS Bite. New edge (0 1)–(0 2) ⊂ HALF_RIGHT diameter. CAP is Q1 minus the right half-rectangle (a shell, not an interior ring). CUP punches the leftover left half. Exact, isApproximate()=false.
H-SHELL-HOLE-X Named miss. Two holes. assertNull stays. Not P2.4.
H-SHELL-HOLE-OUTER (hole meets the other diameter) Named miss. Collinear overlap, not two crossing nodes. Not this cell.
SAME-OUTER-HOLE / DIFF-OUTER-HOLE Unchanged. Already sewn.
P2.1 node pins / P2.2 MIXED / H-SAME-CIRCLE / H-ANNULUS-TANGENT / TOUCH-ext Unchanged.

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 16 / 0 (hole-ring nodes (0 1) / (0 2); Geometry-level pair still null)
  • CompoundCurveShellOverlayTest 25 / 0 (HOLE-CROSS bite CAP/CUP/SUB/XOR; HOLE-X stays assertNull)
  • CircularArcOverlayTest 11 / 0
  • CircularDiscOverlayTest 12 / 0
  • CircularDiscPolygonOverlayTest 7 / 0
  • CircularLineOverlayTest 7 / 0
  • OverlayNGCurvePhase0Test 19 / 0
  • OverlayNGCurveRatchetTest 46 / 0 (hole-straddle EEEE both orders)
  • OverlayNGCurvePerfGateTest 80 / 0 (15% slack)
  • Naming-guard OK; Checkstyle 0 violations; PMD check on jts-curve succeeded

Slack stays 15%. Overlay name is OverlayNGCurve. No new public API. No noder was written in jts-core.

Open in Web Open in Cursor 

H-SHELL-HOLE-CROSS is the first face walk: even-n hole ∩ other
shares the clip edge, and new edge ⊂ other.shell is a bite, not
a punched hole. Overlay splices that bite or punches the leftover.
H-SHELL-HOLE-X stays a named miss. No noder in jts-core.

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