Skip to content

P2.2 overlap-as-edge on CurveSegmentString (OV-P2 / Bar 2) - #17

Open
grootstebozewolf wants to merge 3 commits into
cursor/p21-curve-segment-string-7422from
cursor/p22-overlap-as-edge-632c
Open

P2.2 overlap-as-edge on CurveSegmentString (OV-P2 / Bar 2)#17
grootstebozewolf wants to merge 3 commits into
cursor/p21-curve-segment-string-7422from
cursor/p22-overlap-as-edge-632c

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on cursor/p21-curve-segment-string-7422 @ d3e0843 (draft #16). Do not merge this into #7. This is OV-P2 / Bar 2, not OV-P1. Does not merge #12 / #13 / #15 / #16 / #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 first (P2.1), then overlap as an edge. Densify is never a noder.

What this is

P2.1 CurveSegmentString + CurveSegmentNoder emit a discrete node set, or null. MIXED was the first miss because collinear overlap is an interval, not a cheap node set.

P2.2 teaches those strings that a shared run is an edge (an interval on one circle, or a collinear segment), not a pair of endpoints pretending to be the whole story.

CircleSweepOverlay.sharedSweep is the same-circle interval the kits already sew. The noder lifts that onto the string. Collinear overlap uses LineIntersector.COLLINEAR_INTERSECTION endpoints as a segment. A different-circle tangent (intersectCircles length 1, on both sweeps) is a zero-length degenerate edge. No face walk. No CurvePolygon for a kiss.

Package-private. Reuses CurveSegmentString, CircleSweepOverlay, intersectCircles, isOnSweep. No new public API. No noder in jts-core. Name is OverlayNGCurve.

Edges vs named misses

Fixture This rung
H-SHELL-N-MIXED Edge. Overlapping diameter (-1 0)–(1 0). nodes() stays null (not a point set). Overlay kit still refuses — no face walk.
H-SAME-CIRCLE Edge. Shared quarter of CIRCLE_5, length 2.5π, already sewn by CircleSweepOverlay. Locked on the string. Endpoint-only kiss is not an interval.
H-SAME-CIRCLE two-shell Edge. HALF_DISC ∩ HALF_RIGHT lifts that quarter onto two CompoundCurve shells.
H-ANNULUS-TANGENT Degenerate edge at (5 0). Zero-width pinch (d+r=R). Overlay does not punch an annulus. nodes() stays null.
TOUCH-ext Degenerate edge at (1 0). Unit discs, centres (0,0) and (2,0), d=r1+r2. Oracle FF2F01212 (EXT_TANGENT). nodes() stays null (not a 2-node set). CircularDiscOverlay stays null — a point is not a CurvePolygon.
R-LL collinear overlap Edge on the noder: (2 0)–(10 0). Public helper still misses; public overlay stays approximate (R2). Not chordsaw-as-exact.
R1.5 / R1.6-2 / H-SHELL-2 / even-n / D2-odd Nodes, bit-identical. Crossing is not a shared run.
H-SHELL-HOLE-CROSS / H-SHELL-HOLE-X Named miss. Holes stay null (P2.3 / P2.4).

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 (TOUCH-ext pin added)
  • CircularDiscOverlayTest 12 / 0
  • OverlayNGCurveRatchetTest 44 / 0
  • OverlayNGCurvePerfGateTest 78 / 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. Overlay kits were not changed.

Open in Web Open in Cursor 

cursoragent and others added 3 commits August 16, 2026 08:02
Teach the P2.1 strings that a shared run is an interval (same-circle
sweep or collinear segment), not a pair of endpoints. A tangent pinch
is a zero-length edge. nodes() stays the discrete set. No faces, no
jts-core noder, no merge into PR #7.

Co-authored-by: Jeroen Bloemscheer <grootstebozewolf@users.noreply.github.com>
Use a line that extends past the LineString member so public overlay
cannot retain an operand. Helper still misses; public stays
approximate. The noder names (2 0)–(10 0).

Co-authored-by: Jeroen Bloemscheer <grootstebozewolf@users.noreply.github.com>
Unit discs at (0,0) and (2,0), d=r1+r2, kiss (1,0). Oracle
EXT_TANGENT. nodes() stays null. Overlay stays null — a point is
not a CurvePolygon. The noder names the zero-length edge.

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