Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
30fb3e0
feat: Option B SegmentKind + linearization strategy + WKB 18–21 codes
cursoragent Aug 17, 2026
a062f42
feat: WKB 18 CRV-CLOTHOID greenfield round-trip
cursoragent Aug 17, 2026
198ac89
feat: OverlayNG-for-circles R-OV (Option B) + curve segment bridge
cursoragent Aug 17, 2026
7016575
feat: OFF concentric OffsetCurve for single-arc CircularString
cursoragent Aug 17, 2026
5a8c813
feat: WKB 19–21 BezierCurve EllipseCurve NurbsCurve greenfield
cursoragent Aug 17, 2026
cbd4dc3
feat: BUF-1/BUF-NEG open-arc buffer corridor laser
cursoragent Aug 17, 2026
da2233c
feat: fold HP.2/HP.3 CurveHotPixel + snap headings onto MMF tip
cursoragent Aug 17, 2026
b12758a
spec: retip epic to MMF Option B + WKB 18-21 SIGN
cursoragent Aug 17, 2026
68e2680
spec: epic field contract names Option B and no silent linearize
cursoragent Aug 17, 2026
73b8810
feat: fold CurveSegmentDcel (P2.5.7) onto MMF tip
cursoragent Aug 17, 2026
33be0d7
fix: TB-FN #60 Exec stays on selected function, not Buffer
cursoragent Aug 17, 2026
31197f4
feat: BUF-N stadium CompoundCurve buffer subset
cursoragent Aug 17, 2026
6f6f8b1
fix: VBF honesty densify curve inputs via CurveOps.linearise
cursoragent Aug 17, 2026
af45a65
spec: epic §4.0 MMF Option B landed table + MMF_OPTION_B.md
cursoragent Aug 17, 2026
86198b8
doc: README cites WKB 18-21 zoo and MMF Option B gate
cursoragent Aug 17, 2026
3ff2c07
fix: CompoundCurve/CurvePolygon translate visits all member controls
cursoragent Aug 17, 2026
99f5449
feat: BUF-N open two-member line+arc CompoundCurve corridor
cursoragent Aug 17, 2026
3dbf8fb
spec: epic notes BUF-N open corridor ship
cursoragent Aug 17, 2026
5833b54
feat: BUF-N open CompoundCurve corridor for N members
cursoragent Aug 17, 2026
e91e8d3
feat: VBF arc-length densify via CurveOps.lineariseArcLength
cursoragent Aug 17, 2026
cf4b66d
feat: DSF Densifier→toLinear + TRI-DT/VR curve site densify
cursoragent Aug 17, 2026
c01d862
spec: epic notes DSF and TRI-DT/VR ships
cursoragent Aug 17, 2026
6b742b5
feat: ship green meters + AT-NS densify + public CurveIntersection
cursoragent Aug 17, 2026
b9d319b
feat: F-CP compound rings, LRF-LEN arc extractPoint, ship B-CP/B-MS
cursoragent Aug 17, 2026
387a901
feat: C-LIN centroid, S-* preserve CS, ship OV/D-*/R-CONT/F-RD/TB-T
cursoragent Aug 17, 2026
e7426fd
feat: LRF-LOC CompoundCurve members, C-IP densify, PRC-SN preserve
cursoragent Aug 17, 2026
f18337e
feat: V-CP densify validity, N-SS/R-PR meters, TB-FN badges
cursoragent Aug 17, 2026
756fa70
feat: VBF VariableBuffer densifies curves via arc-length
cursoragent Aug 17, 2026
cb74959
feat: H-CC densify ConcaveHull sites; PLG densify Polygonizer edges
cursoragent Aug 17, 2026
d0f8092
feat: mark HullFunctions concaveHull length-ratio as curve passthrough
cursoragent Aug 17, 2026
a1e7a5e
docs: refresh MMF_OPTION_B shipped meters and HOLD
cursoragent Aug 17, 2026
23be391
feat: COV CurveCoverageUnion keeps exterior CIRCULARSTRINGs
cursoragent Aug 17, 2026
8d766ae
docs: mark COV shipped in MMF_OPTION_B
cursoragent Aug 17, 2026
bd1dba0
feat: TestBuilder curve strategy picker + warn sink to Log tab
cursoragent Aug 17, 2026
d45c89b
docs: retip epic to bd1dba09
cursoragent Aug 17, 2026
6f9ae15
docs: tip SHA + MMF TestBuilder WarnSink note
cursoragent Aug 17, 2026
db1bdc2
docs: sync epic tip SHA to 6f9ae158
cursoragent Aug 17, 2026
6e3bda9
feat: D-HF densify curve package inputs on general Hausdorff path
cursoragent Aug 17, 2026
f6adc84
docs: note D-HF densify honesty + folded #52/#55 pins
cursoragent Aug 17, 2026
4025603
feat: fold #40 ClothoidOverlay kit + #26 HP.1 pin docs/tests
cursoragent Aug 17, 2026
82b93ae
docs: note #40 ClothoidOverlay and #26 HP.1 fold
cursoragent Aug 17, 2026
f86b6e9
docs: cherry-pick #47 LaTeX guide sources onto MMF tip
cursoragent Aug 17, 2026
f4d6a88
docs: epic notes doc/latex cherry-pick from #47
cursoragent Aug 17, 2026
2d3f772
docs: retip latex README to MMF PR #61
cursoragent Aug 17, 2026
0389853
feat: WKB 18-21 inspect labels + curve strategy status strip
cursoragent Aug 17, 2026
2e58807
feat: show Curve strategy LINEARIZED on TestBuilder status at startup
cursoragent Aug 17, 2026
c8c5c05
test: WKB 18-21 ISO Z round-trips + Option B PM kind stability
cursoragent Aug 17, 2026
93c67b7
docs: Phase 4 ISO-Z and PM kind-stability accept criteria
cursoragent Aug 17, 2026
21a0d9b
docs+fix: Option B prose in guides; clothoid ISO M/ZM honesty
cursoragent Aug 17, 2026
6f5ec9b
docs: user-guide Option B prose + MMF verification walkthrough
cursoragent Aug 17, 2026
0cf0eb3
docs: retip epic MMF ship status + explicit named-miss list
cursoragent Aug 17, 2026
5d35c39
docs: sync epic tip SHA to 0cf0eb3d
cursoragent Aug 17, 2026
e22a3a3
fix: CI red — SqlMmTypes HOLD 15-17, CurveWKTWriter owns CurvePolygon…
cursoragent Aug 17, 2026
659d339
fix: restore logoBuffer JOIN_MITRE + mitre limit (CI app tests)
cursoragent Aug 17, 2026
bcb14fc
fix: headless-safe AppCursors for CI drawing-tool tests
cursoragent Aug 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 79 additions & 68 deletions EPIC_SFA_CURVE_AWARENESS.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ JTS wordmark as curves plus a buffer halo (`logoLines` + `logoBuffer`: `toLinear
not a laser. Do not caption a clothoid halo. #55 clothoidHalo is not
this door. Do not commit mkt1_1920x1080.png as a clothoid. -->

This fork treats SQL/MM ISO/IEC 13249-3 curve types 8–12 (`CIRCULARSTRING`, `COMPOUNDCURVE`, `CURVEPOLYGON`, `MULTICURVE`, `MULTISURFACE`) as first-class geometry. WKB/WKT ISO and EXTENDED Z/M/ZM landed in [#51](https://github.com/grootstebozewolf/jts/pull/51) (`CircularStringZ=1008`, …). Types 15–17 still unknown and throw. Core `WKBWriter` refuses to flatten 8–12. TestBuilder lives in `modules/app`.
This fork treats SQL/MM ISO/IEC 13249-3 curve types 8–12 (`CIRCULARSTRING`, `COMPOUNDCURVE`, `CURVEPOLYGON`, `MULTICURVE`, `MULTISURFACE`) as first-class geometry, plus signed greenfield WKB **18–21** (`CRV-CLOTHOID`, `PRF-BEZIER`, `PRF-ELLIPSE`, `CRV-NURBS`). WKB/WKT ISO and EXTENDED Z/M/ZM landed in [#51](https://github.com/grootstebozewolf/jts/pull/51) (`CircularStringZ=1008`, …). Types 15–17 still unknown and throw. Core `WKBWriter` refuses to flatten curve types. TestBuilder lives in `modules/app`.

### User path

Expand All @@ -23,7 +23,7 @@ Build this tree and run TestBuilder. Load a `CIRCULARSTRING` — it must stay a

### Developer path

Working branch / source of truth: [`feature/sfa-curve-rgr`](https://github.com/grootstebozewolf/jts/tree/feature/sfa-curve-rgr). `mvn clean install` from the [Developing Guide](DEVELOPING.md). Curve work lives in the curve module. Do not silently flatten. Named linear fallback only if named.
Working branch / source of truth: [`feature/sfa-curve-rgr`](https://github.com/grootstebozewolf/jts/tree/feature/sfa-curve-rgr). `mvn clean install` from the [Developing Guide](DEVELOPING.md). Curve work lives in the curve module. Do not silently flatten. Named linear fallback only if named. MMF Option B quality gate: [doc/MMF_OPTION_B.md](doc/MMF_OPTION_B.md) (draft [PR #61](https://github.com/grootstebozewolf/jts/pull/61)).

* [Developing Guide](DEVELOPING.md)
* [Contributing Guide](CONTRIBUTING.md)
Expand Down
56 changes: 56 additions & 0 deletions doc/MMF_OPTION_B.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# MMF Option B — fork quality gate (#1195)

Draft companion to [PR #61](https://github.com/grootstebozewolf/jts/pull/61) on SoT [PR #7](https://github.com/grootstebozewolf/jts/pull/7). Not an upstream LocationTech proposal until maintainers engage.

## Contract

1. **Noder = Option B.** `[i,i+1]` is `SegmentKind.LINEARIZED | ARC | CERTIFIED`. Default earth is linearized. Exact consumers ask `mayCollapseToChord`. Spatial indexes may use PM-scaled chord/expanded bounds (the allowed lie). **PM snap must not rename kind** — see `SegmentStringContractTest#testPrecisionModelSnapDoesNotChangeSegmentKind`.
2. **No silent linearization.** `CurveLinearizationStrategy` default is `LINEARIZED` and **must warn**. `PRESERVE` keeps curve identity.
3. **Laser order:** Maintainable → soundness/precision → functionality/performance. Prefer chainsaw when faster unless (1) or (2) require a laser. PERF-GATE slack **15%**.
4. **Overlay name:** `OverlayNGCurve`, never *Curved*.
5. **WKB zoo SIGN:** types **18–21** (`CRV-CLOTHOID`, `PRF-BEZIER`, `PRF-ELLIPSE`, `CRV-NURBS`) plus ISO `+1000/+2000/+3000`. Types **15–17** stay Architect-gated. XY + ISO Z locked in `WKBClothoidTest` / `WKBCurveZoo19_21Test`.

## Shipped meter clusters (green)

Option B + WKB 18–21 + OFF/BUF-*/VBF + DSF/TRI + N-AA/AL/N-SS + F-*/B-* + LRF-LEN/LOC + AT-S/NS + C-LIN/AREA/IP + S-* + OV + D-AA/OP + R-CONT/PR + V-CS/CP + PRC-SN + H-CC + PLG + COV + TB-T/FN.

Still red by design: **D-HF** (full TAG keep `fail()`; apex closed-form + general curve densify honesty landed).

### Named misses (Phase 2 accept — explicit)

- CLOTHOID-FRESNEL; VBF arc-offset laser; PLG CurvePolygon faces; HP.1 wrong-ring walk; OverlayNGCurve R2 stamps; WKB 15–17 Architect-gated.

Folded pins onto tip: **#55** `logoClothoid`, **#52** write-flatten honesty, **#40** `ClothoidOverlay`, **#26** HP.1.

## Verify (smoke)

See also [MMF_WALKTHROUGH.md](MMF_WALKTHROUGH.md).

```bash
bash dev/check-no-curved.sh
mvn -pl modules/core,modules/curve,modules/app -am test \
-Dtest=SegmentStringContractTest,WKBClothoidTest,WKBCurveZoo19_21Test,CurveOffsetCurveTest,CurveBufferArcTest,OverlayNGCircleTest,CurveHotPixelTest,CurveSegmentDcelTest,CurveLinearizationStrategyTest,CurveAwarenessGreenMetersTest,CurveAwarenessBadgeTest,ClothoidOverlayTest,GeometryLocationsWriterCurveZooTest \
-DfailIfNoTests=false -Dcheckstyle.skip=true -Dpmd.skip=true
```

## TestBuilder (Phase 5)

- Log tab receives `CurveLinearizationStrategy` densify warnings via `WarnSink`.
- Edit menu: **Curve strategy: LINEARIZED (warn)** / **PRESERVE**.

## Guides (Phase 6)

LaTeX sources live under `doc/latex/` (from draft [#47](https://github.com/grootstebozewolf/jts/pull/47), cherry-picked without force-merging the conflicting binary PDFs). Rebuild with TeX Live:

```
cd doc/latex && make
```

In-tree `doc/*.pdf` stubs remain until a clean `make` is signed off.

## HOLD

- Issue [#56](https://github.com/grootstebozewolf/jts/issues/56): tip locks `CurvePolygonToolTest` (16/16); leave open until PO UX SIGN on pin JAR.
- Issue [#60](https://github.com/grootstebozewolf/jts/issues/60): Exec/`currentFunc` fix landed; await UX SIGN.
- Guides [#47](https://github.com/grootstebozewolf/jts/pull/47): LaTeX rebuild CONFLICTING — do not force-merge.
- Do not open `locationtech/jts` PRs from this branch without PO word.
44 changes: 44 additions & 0 deletions doc/MMF_WALKTHROUGH.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# MMF Option B — verification walkthrough (#1195)

Evidence for draft [PR #61](https://github.com/grootstebozewolf/jts/pull/61) on fork SoT [#7](https://github.com/grootstebozewolf/jts/pull/7). Tip branch: `cursor/jts-issue-1195-c5d1`.

## Automated smoke (2026-08-17)

```bash
bash dev/check-no-curved.sh # OK: no 'Curved' stems
mvn -pl modules/core,modules/curve,modules/app -am test \
-Dtest=SegmentStringContractTest,WKBClothoidTest,WKBCurveZoo19_21Test,CurveOffsetCurveTest,CurveBufferArcTest,OverlayNGCircleTest,CurveHotPixelTest,CurveSegmentDcelTest,CurveLinearizationStrategyTest,CurveAwarenessGreenMetersTest,CurveAwarenessBadgeTest,ClothoidOverlayTest,GeometryLocationsWriterCurveZooTest \
-DfailIfNoTests=false -Dcheckstyle.skip=true -Dpmd.skip=true
```

Observed: **BUILD SUCCESS** — green meters 36/36; WKB 18 XY+ISO Z/M/ZM; WKB 19–21 XY+ISO Z; SegmentKind PM snap ≠ kind rename; ClothoidOverlay 5/5; zoo inspect labels 1/1.

## Phase accept checklist

| Phase | Evidence |
|---|---|
| 0 Strategy | `CurveLinearizationStrategyTest`; WarnSink → TB Log |
| 1 Option B | `SegmentStringContractTest` (incl. PM kind stability); OverlayNGCircle |
| 2 Bar2/HP | HP.1–3, DCEL, ClothoidOverlay, BiteVsHole/TwoHole on tip |
| 3 Ops | OFF/BUF/VBF/COV green meters |
| 4 WKB 18–21 | `WKBClothoidTest` / `WKBCurveZoo19_21Test` (XY + ISO Z; clothoid M/ZM) |
| 5 TB UX | badges, strategy menu+status, #56/#60 code; **await UX SIGN** |
| 6 Docs | `doc/MMF_OPTION_B.md`, `doc/latex/` Option B prose; **PDF `make` HOLD** |

## Remaining red (by design)

- **D-HF** — apex closed-form exists; full TAG `fail()` kept per meter text.

## Human HOLD

- UX SIGN on issues #56 / #60 (pin JAR)
- Guides: `cd doc/latex && make` when TeX Live available; do not force-merge conflicting Amyuni PDF binaries from #47
- Do not force-fold #28 / #41 (would delete tip MMF work)

## Manual UX (when SIGN ready)

1. Launch TestBuilder from MMF tip JAR.
2. Edit → Curve strategy: LINEARIZED — status strip + Log warn on densify.
3. Draw CurvePolygon; finish without close → CURVEPOLYGON (not POLYGON).
4. Select Buffer, focus a param, switch function — no silent Buffer rebound (#60).
5. Inspect Bezier/Ellipse/NURBS WKT — facet labels show type.
7 changes: 7 additions & 0 deletions doc/latex/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
*.aux
*.log
*.out
*.toc
developer-guide.pdf
user-guide.pdf
technical-specs.pdf
36 changes: 36 additions & 0 deletions doc/latex/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Rebuild the three 2003-2005 JTS manuals from LaTeX.
# Requires pdflatex (TeX Live). Run from this directory:
# make
# Output PDFs replace the in-tree copies under doc/.

LATEX ?= pdflatex
LATEXFLAGS ?= -interaction=nonstopmode -halt-on-error
DOC := ..

.PHONY: all clean developer user specs

all: developer user specs

developer-guide.pdf: developer-guide.tex jtsguide.sty
$(LATEX) $(LATEXFLAGS) developer-guide.tex
$(LATEX) $(LATEXFLAGS) developer-guide.tex

user-guide.pdf: user-guide.tex jtsguide.sty
$(LATEX) $(LATEXFLAGS) user-guide.tex
$(LATEX) $(LATEXFLAGS) user-guide.tex

technical-specs.pdf: technical-specs.tex jtsguide.sty
$(LATEX) $(LATEXFLAGS) technical-specs.tex
$(LATEX) $(LATEXFLAGS) technical-specs.tex

developer: developer-guide.pdf
cp -f developer-guide.pdf "$(DOC)/JTS Developer Guide.pdf"

user: user-guide.pdf
cp -f user-guide.pdf "$(DOC)/JTS TestBuilder & TestRunner User Guide.pdf"

specs: technical-specs.pdf
cp -f technical-specs.pdf "$(DOC)/JTS Technical Specs.pdf"

clean:
rm -f *.aux *.log *.out *.toc developer-guide.pdf user-guide.pdf technical-specs.pdf
41 changes: 41 additions & 0 deletions doc/latex/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# JTS 2003–2005 guides (LaTeX)

Sources for the three in-tree manuals. Rebuild with `pdflatex` (TeX Live):

```
cd doc/latex
make
```

That writes:

- `doc/JTS Developer Guide.pdf`
- `doc/JTS TestBuilder & TestRunner User Guide.pdf`
- `doc/JTS Technical Specs.pdf`

Chapter plans follow the 2003–2005 Amyuni conversions. Prose SoT
tracks MMF draft [#61](https://github.com/grootstebozewolf/jts/pull/61)
on fork [#7](https://github.com/grootstebozewolf/jts/pull/7)
(`feature/sfa-curve-rgr`). Public DHD two-pair lock via `0ca71b`
(APEX 3.967640600249787; two circular discs). Guide JAR pin stays
`61eb3377` for figure rasters. CircularString / CompoundCurve /
CurvePolygon / WKB 18–21 are SQL/MM Spatial (ISO/IEC 13249-3) plus
fork SIGN greenfield. No 13249-3 DOI; no JTS DOI.

Figure-slot frame lock:

- Guide shots are 4:3 at 1600×1200, full TestBuilder window, from
`JTSTestBuilder-pr7.jar` @ `61eb3377`. Rasters live in
`doc/latex/figures/`.
- Filled (batch 1): UG-1 / DG-1 draw CircularString; UG-2 A-blue /
B-red icons; UG-3 CompoundCurve; UG-4 CurvePolygon disc; UG-7 /
DG-3 / TS-2 disc hull \(25\pi\); TS-3 single-arc hull \(12.5\pi\);
UG-8 / TS-6 compound H-CC hull 61.59119 (CurvePolygon with
CircularString).
- Still empty (do not invent): DG-2 / TS-1 WKB; DG-4 / TS-4 /
TS-5 / UG-5 / UG-6 D-HF. Slot id only; no caption on unshot work.
- MKT-1 is 16:9 1920×1080 canvas-only and is **not** a manual
figure. Do not put it in these guides.

`doc/JTS_Version_History.md` is a separate concise-claims file; do
not edit it from this rebuild.
Loading
Loading