Skip to content

P2.1 CurveSegmentString — nodes only (OV-P2 / Bar 2) - #16

Open
grootstebozewolf wants to merge 1 commit into
cursor/cc-nest-annulus-0a09from
cursor/p21-curve-segment-string-7422
Open

P2.1 CurveSegmentString — nodes only (OV-P2 / Bar 2)#16
grootstebozewolf wants to merge 1 commit into
cursor/cc-nest-annulus-0a09from
cursor/p21-curve-segment-string-7422

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on cursor/cc-nest-annulus-0a09 @ d33b0cb (draft #15). Do not merge this into #7. This is OV-P2 / Bar 2, not OV-P1. Does not merge #12 / #13 / #15 / #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. Densify is never a noder.

What this is

P2.1 is CurveSegmentString, not a free-floating CircularNoder of raw Coordinate[].

A package-private curve-module string: one piece is a straight chord or a circular arc (control triple / centre-radius-sweep — the same atom TwoNodeClip.Edge already is). A package-private CurveSegmentNoder intersects those strings and returns the discrete node set, or null.

Lives in org.locationtech.jts.operation.overlayng.curve (same package as TwoNodeClip) so intersectCircles / isOnSweep / line–circle stay package-private. org.locationtech.jts.noding.curve would need a public bridge; that is P2.5-shaped. Not a core SegmentString / Noder. Not N-SS.

Pins

Fixture Nodes
R1.5 two-disc (3.5, ±√12.75) — bit-identical to TwoNodeClip.intersectCircles
R1.6-2 disc-vs-plain (0, ±5) — same segment–circle hits
H-SHELL-2 (±3, 4)
H-FOUR even-n (±√24, ±1)
H-SHELL-N even-n (±1, 0), (±1, √24)
H-SHELL-N-ODD (±1, 0) + tangent (0, 5) — the tangent is a node

MIXED is the first miss. H-SHELL-N-MIXED (collinear overlap) stays null. So do pinch (H-ANNULUS-TANGENT) and holes (H-SHELL-HOLE-CROSS, H-SHELL-HOLE-X). No overlap-as-edge (P2.2). No faces. No hole punch (P2.3). No two-hole (P2.4). No public core noder (P2.5).

TwoShellClip pair hits now go through CurveSegmentString.intersect — one place for the math, kits still assemble faces.

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,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 11 / 0
  • CompoundCurveShellOverlayTest 24 / 0
  • CircularArcOverlayTest 11 / 0
  • CircularDiscOverlayTest 12 / 0
  • CircularDiscPolygonOverlayTest 7 / 0
  • OverlayNGCurvePhase0Test 19 / 0
  • OverlayNGCurveRatchetTest 44 / 0
  • OverlayNGCurvePerfGateTest 78 / 0 (15% slack)
  • mvn -pl modules/curve test: 600 tests, 0 failures
  • Naming-guard OK; Checkstyle 0 violations; PMD check on jts-curve succeeded

Slack stays 15%. Overlay name is OverlayNGCurve. No new public API.

Open in Web Open in Cursor 

Package-private curve piece (chord or arc) plus a noder that returns
the discrete node set the kits already compute. MIXED is the first
miss. No faces, no N-SS, no public API.

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