Skip to content

P2.5.3 N-shell faces in jts-curve (OV-P2 / Bar 2) - #24

Open
grootstebozewolf wants to merge 2 commits into
cursor/p252-n-string-nodes-16ddfrom
cursor/p253-n-shell-faces-1cb3
Open

P2.5.3 N-shell faces in jts-curve (OV-P2 / Bar 2)#24
grootstebozewolf wants to merge 2 commits into
cursor/p252-n-string-nodes-16ddfrom
cursor/p253-n-shell-faces-1cb3

Conversation

@grootstebozewolf

@grootstebozewolf grootstebozewolf commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Stacked on cursor/p252-n-string-nodes-16dd @ b983f6a (draft #23, P2.5.2 N-string nodes). Do not merge this into #7. This is OV-P2 / Bar 2, not OV-P1. Does not merge #12 / #13 / #15 / #16 / #17 / #18 / #19 / #20 / #23 / #7. Does not push to feature/sfa-curve-rgr or master. P2.5.5 is not started.

Sentence

The noder is the named-miss suite, one assembly rule at a time. P2.1 nodes, P2.2 overlap-as-edge, P2.3 bite vs hole, P2.4 two-hole, hole-on-diameter, P2.5.2 N-string nodes. This rung assembles faces of N shells from that node set + those edges. Densify is never a noder. Snap-rounding is P2.5.4, not this rung: if the walk needs snap-rounding, stamp and stop. Core SegmentString / Noder is P2.5.5, 74 files, LOCKED.

What this is

P2.5.3: package-private CurveSegmentFaces in org.locationtech.jts.operation.overlayng.curve.

  • faces(Geometry[]) / faces(List<List<CurveSegmentString>>, scale)
  • Collects the P2.5.2 all-pairs node set and P2.2 shared-edge ends
  • Splits each string at those points
  • Walks next-outgoing at each node (leave-angle order)
  • Returns closed rings (or null). The complementary outer ring (area = sum of the interiors) is dropped so the product is the bounded faces.

N=2 recovers the existing pair-kit faces (CAP + XOR components, count and area). A 0-node containment or a same-circle special case falls back to those kits. OverlayNG stays binary — this is the arrangement product, not an N-ary public overlay. If a pair among the N is wired as binary overlay, the existing kits stay in charge of CAP/CUP/SUB/XOR.

MIXED / pinch / holed Geometry-level stays null. Hole rings are walked as strings, as in P2.3/P2.4. A coincident leave-angle at a node (tangent pinch) is snap-rounding (P2.5.4): faces returns null with that reason. No HotPixel / ScaledNoder / core SegmentString.

No public API. Name is OverlayNGCurve.

Pins

N=2 recovers pair kits (area- and count-identical CAP+XOR):

  • R1.5 two-disc lens + crescents
  • R1.6-2 disc vs plain
  • H-SHELL-2 two-shell lens
  • H-FOUR / H-SHELL-N
  • H-SHELL-N-ODD (walk stamps the tangent; pair-kit fallback recovers the rings)
  • H-SAME-CIRCLE sectors (HALF_DISC × HALF_RIGHT)

Named nulls unchanged:

  • H-SHELL-N-MIXED, H-ANNULUS-TANGENT, TOUCH-ext
  • H-SHELL-HOLE-X Geometry-level holed pair

New N≥3 pin (existing fixtures only):

  • HALF_DISC × HALF_HANGING × STADIUM_FOUR: nine bounded faces, union area 25.5π − LENS + 2, named triple / lens-sides / stadium strip / ears / hanging remainder. Permutation-identical. String-group API matches.
  • HALF_DISC × HALF_HANGING × STADIUM_ODD: tangent leave-angles — stamped null (P2.5.4, not this rung).

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 (N=2 faces recover pair-kit CAP+XOR; MIXED / pinch / holed stay null; N=3 HALF_DISC × HALF_HANGING × STADIUM_FOUR is nine named faces; N≥3 tangent stamps null)
  • CompoundCurveShellOverlayTest 27 / 0 (P2.1–P2.5.2 / HOLE-OUTER unchanged)
  • CircularArcOverlayTest 11 / 0
  • CircularDiscOverlayTest 12 / 0
  • CircularDiscPolygonOverlayTest 7 / 0
  • CircularLineOverlayTest 7 / 0
  • OverlayNGCurvePhase0Test 19 / 0
  • OverlayNGCurveRatchetTest 50 / 0
  • OverlayNGCurvePerfGateTest 82 / 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. P2.5.5 was not started.

Open in Web Open in Cursor 

cursoragent and others added 2 commits August 16, 2026 09:24
Walk left-most / next-outgoing on the all-pairs node set in jts-curve.
N=2 recovers pair-kit CAP+XOR rings; MIXED / pinch / holed stay null.
A coincident leave-angle (tangent) is snap-rounding — stamp null.
N≥3 pin is HALF_DISC × HALF_HANGING × STADIUM_FOUR. Not P2.5.5.

Co-authored-by: Jeroen Bloemscheer <grootstebozewolf@users.noreply.github.com>
The left-most walk also closes the complementary outer ring (area =
sum of the interiors). Keep every closed ring and drop that union so
N=2 matches pair-kit CAP+XOR counts and the N=3 pin has nine faces.

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