From 4b0eae9cafbccaa5daf8bb19b7467f1bd4958fa1 Mon Sep 17 00:00:00 2001 From: Dane Sabo Date: Sat, 25 Apr 2026 14:51:22 -0400 Subject: [PATCH] Milestone 0.3: I3 fix at acute corners, min-change deform, SplitSegment preserve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Y-intersection had a real I3 overlap at acute corners, caught by a new programmatic centroid-in-other-polygon test (y_intersection_no_overlaps). Fix: bisector-clip regular parcels adjacent to acute corners (interior < 60°). Obtuse corners keep their rectangle/parallelogram corner parcels and need no clip. Minimum-change deformation: when a road's *line* doesn't change — only its endpoints shift along the same line, e.g., the bottom road gets longer when its right endpoint moves outward — parcels whose frontage is still on the new segment are reported as Untouched and keep their absolute coordinates. Only parcels on a road that actually rotated get re-projected. Trade-off: vertex-exact inverse-restore is no longer guaranteed (centroid drift bounded by edit delta is the new contract). SplitSegment preserve: rebind frontage_road for parcels whose frontage is entirely on one side of the split point, or split into two parcels along a perpendicular through the split point for parcels that span. road_split_preserves test is now active and passing. acute_intersection_15deg/5deg also active. Test status: 24 unit + 20 integration + 1 doc passing; only cul_de_sac and curved_road_high_curv still ignored (need real curved roads). Journal §11 session 3 entry added with D14, D15, D16, two spec deviations, and the milestone-0.4 queue. Co-Authored-By: Claude Opus 4.7 (1M context) --- journal.pdf | Bin 319224 -> 328537 bytes journal.tex | 155 ++++ road_parceling/Cargo.lock | 1007 ++++++++++++++++++++++++ road_parceling/src/parcel/deform.rs | 199 ++++- road_parceling/src/parcel/subdivide.rs | 10 +- road_parceling/tests/degenerate.rs | 100 ++- 6 files changed, 1446 insertions(+), 25 deletions(-) create mode 100644 road_parceling/Cargo.lock diff --git a/journal.pdf b/journal.pdf index 508911d699d589005da862077eda537af5569158..53d5aa010a041a9d483190666d59413791358be0 100644 GIT binary patch delta 59526 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

%9*9 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 diff --git a/journal.tex b/journal.tex index 7265f1e..332c8fe 100644 --- a/journal.tex +++ b/journal.tex @@ -1023,6 +1023,161 @@ implementation cost: % Future sessions land below this line as new \subsection entries. +% ----------------------------------------------------------------- +\subsection{2026-04-25 --- Session 3: Milestone 0.3 (I3 fix, +minimum-change deformation, SplitSegment preserve)} +\label{sec:session-3} + +\paragraph{Goal of the session.} +Three things came out of looking at session-2's figures: + +\begin{enumerate}[noitemsep] + \item The Y-intersection figure had visible parcel overlaps. A + programmatic test confirmed a real I3 violation — parcels from + adjacent block edges were converging into the same interior near + the acute outer corners. + \item The road-edit figure was \emph{too} eager to deform parcels. + When a road's bottom-right corner moved outward, both the bottom + road's parcels (whose road just got longer along the same line) + and the right road's parcels (whose road actually rotated) showed + up as deformed. The user's preference: only deform parcels on a + road whose direction \emph{actually changed}. + \item Pushing on milestone 0.3 work — \texttt{SplitSegment} + preserve, and as much of the acute-corner / curve story as we can + fit. +\end{enumerate} + +\paragraph{Decisions locked in this session.} + +\begin{decision}[D14, 2026-04-25 -- Minimum-change deformation +(``no-op preserve'')] +When a road edit doesn't change a road's \emph{line} — only its +endpoints shift along the same line, e.g.\ when one node moves +parallel to the road — a parcel whose frontage is still entirely on +the new segment is reported as ``Untouched''. It stays at its +absolute coordinates and isn't added to any +\texttt{EditOutcome} bucket. Trade-off: strict +\emph{vertex-by-vertex} inverse-restore is no longer guaranteed +(corner parcels that got displaced by an earlier edit aren't pulled +back to their original spot when the edit is reversed); the +\texttt{road\_edit\_inverse\_restores} test now checks centroid +drift bounded by the edit delta instead. +\end{decision} + +\begin{decision}[D15, 2026-04-25 -- Bisector-clip at acute corners, +not obtuse] +Acute corners (interior angle $< 60^\circ$) get no corner parcel — +the rectangle/parallelogram construction would extend past the +wedge boundary. Instead, regular parcels along the two edges meeting +at an acute corner get bisector-clipped at that corner, so their +territories stay separated. Obtuse corners ($\geq 60^\circ$) keep +the milestone-0.2 corner parcel and need no bisector clip. +\end{decision} + +\begin{decision}[D16, 2026-04-25 -- \texttt{SplitSegment} preserve +on 4-vertex parcels] +When a road is split, parcels whose frontage entirely on one side of +the split point have their \texttt{frontage\_road} rebound (no +geometric change, reported as Deformed). Parcels whose frontage +spans the split point are cut into two parcels along a perpendicular +through the split — only for the simple 4-vertex (rectangle) case; +more complex polygon shapes fall back to Condemn. Buildings stay +with the larger of the two halves. +\end{decision} + +\paragraph{What landed.} + +\begin{itemize}[leftmargin=*] + \item \texttt{tests/degenerate.rs::y\_intersection\_no\_overlaps} — a + programmatic centroid-in-other-polygon check. Caught the real + Y-intersection I3 violation; passes after the bisector-clip fix. + \item \texttt{subdivide.rs}: re-introduced + \texttt{corner\_bisector} and \texttt{clip\_with\_bisector}, called + conditionally for parcels at acute corners only. + \item \texttt{deform.rs}: new \texttt{DeformResult::Untouched} + branch and the line-unchanged check that returns it. Parcels in + \texttt{Untouched} state are left alone. + \item \texttt{deform.rs}: \texttt{split\_segment\_path} + + \texttt{rebind\_frontage\_road} helpers. \texttt{road\_split\_preserves} + is now active and passing. + \item Two acute-intersection tests + (\texttt{acute\_intersection\_15deg/5deg}) are now active and pass + the I1–I3 invariant check; they don't yet exercise full + sliver-merge but no longer trigger panics or overlaps. +\end{itemize} + +\paragraph{Deviations from spec.} + +\subsubsection*{2026-04-25 --- Inverse-restore is centroid-bounded, +not vertex-exact} + +What changed: \cref{sec:edit-handling}'s I7 (``Applying an edit and +then its inverse restores the original parcel set within +$\varepsilon_{\text{geom}}$ for all preserved parcels'') is satisfied +in spirit but not literally. With the minimum-change deformation +path of D14, parcels whose frontage line didn't change keep their +absolute coordinates; an earlier edit might have left a corner +parcel at, say, $(0.5, 0)$ instead of its original $(0, 0)$, and the +inverse edit will not pull it back. The +\texttt{road\_edit\_inverse\_restores} test instead asserts that +each surviving parcel's \emph{centroid} drifts no more than the +magnitude of the edit delta itself. + +Why: ``minimal cost'' deformation is what the user explicitly asked +for. Strict vertex-exact inverse-restore is incompatible with that +goal — it forces every parcel touching an incident road to be +re-projected on every edit, even when the parcel didn't really need +to move. Bounded drift is the right trade-off. + +Affected sections: \cref{sec:edit-handling} (I7 reading clarified). + +\subsubsection*{2026-04-25 --- \texttt{Untouched} is not a public +\texttt{EditOutcome} bucket} + +What changed: Internally the deformation pipeline distinguishes four +results — Deformed, Untouched, Regenerate, Condemned — but the +public \texttt{EditOutcome} struct only exposes the three buckets +that carry \texttt{ParcelId}s of parcels that materially changed. +Untouched parcels simply don't appear in the result. Callers can +still infer them: any parcel-id that existed before the edit and +isn't in any of the four buckets after is implicitly Untouched. + +Why: surfacing an explicit ``Untouched'' bucket would mean every +edit on a 10\,000-parcel city walks 10\,000 ids back to the caller, +defeating the point of minimum-change. We let absence carry meaning. + +Affected sections: \cref{sec:edit-handling} (§4.2 outcome bucket +list now reads as ``parcels that materially changed go into one of +these four buckets''; absence implies no change). + +\paragraph{Test status.} +24 unit tests, 20 integration tests (was 16 in session 2), 1 doc +test. Two named tests still \texttt{\#[ignore]}-d: +\texttt{cul\_de\_sac} and \texttt{curved\_road\_high\_curv} — both +need real curved-road handling that's the milestone-0.4 headline. + +\paragraph{What's next --- milestone 0.4 queue.} + +\begin{enumerate}[noitemsep] + \item True sliver-merge for acute corners: instead of + bisector-clipping into thin trapezoids, merge the would-be sliver + with its longer-frontage neighbor. Removes the visual mess at + acute corners without changing the I3 invariant. + \item Curved-road support: discretize curves into polylines with + variable depth caps based on local radius. Unlocks + \texttt{curved\_road\_high\_curv}. + \item Pie-slice parcels for cul-de-sac bulbs. + \item OBB regularization (\cref{sec:regularization}). + \item Spatial index (\texttt{rstar}) for affected-parcel lookup + (\cref{sec:open}'s Q2) — once the linear scan starts to bite at + scale. + \item Q4: regeneration biased to preserve building footprints. + \item ``Fill-the-corner-after-edit'' regenerate: when a corner + parcel ends up disconnected from its road after a node move (e.g., + the gap visible at the bottom-right of \cref{fig:edit-after}), + regenerate just that corner to close the gap. +\end{enumerate} + % ----------------------------------------------------------------- \subsection{2026-04-25 --- Session 2: Milestone 0.2 (corner parcels, sticky back edges, preserve-on-deform)} diff --git a/road_parceling/Cargo.lock b/road_parceling/Cargo.lock new file mode 100644 index 0000000..ee7d66b --- /dev/null +++ b/road_parceling/Cargo.lock @@ -0,0 +1,1007 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "console" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +dependencies = [ + "encode_unicode", + "libc", + "windows-sys", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "glam" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" +dependencies = [ + "mint", + "serde", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", +] + +[[package]] +name = "insta" +version = "1.47.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" +dependencies = [ + "console", + "once_cell", + "serde", + "similar", + "tempfile", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "road_parceling" +version = "0.1.0" +dependencies = [ + "criterion", + "glam", + "insta", + "proptest", + "rand 0.8.6", + "rand_chacha 0.3.1", + "serde", + "slotmap", + "svg", + "thiserror", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "svg" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94afda9cd163c04f6bee8b4bf2501c91548deae308373c436f36aeff3cf3c4a3" + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/road_parceling/src/parcel/deform.rs b/road_parceling/src/parcel/deform.rs index 99d06c4..b74adf9 100644 --- a/road_parceling/src/parcel/deform.rs +++ b/road_parceling/src/parcel/deform.rs @@ -106,9 +106,20 @@ pub fn apply_road_edit( RoadEdit::DeleteSegment { road } => { delete_segment_path(parcels, road, graph, params, &mut outcome)?; } - RoadEdit::SplitSegment { .. } | RoadEdit::InsertSegment { .. } => { - // Split/Insert preservation is milestone-0.3 work — fall - // back to a regenerate of every affected face. + RoadEdit::SplitSegment { road, at } => { + split_segment_path( + parcels, + &graph_before, + graph, + road, + at, + params, + &mut outcome, + )?; + } + RoadEdit::InsertSegment { .. } => { + // Insert preservation is milestone-0.3+ work — for now, + // regenerate every face touched by the new segment. let affected = roads_affected_by_old_id(&graph_before, edit); regenerate_path(parcels, graph, params, &affected, &mut outcome)?; } @@ -270,8 +281,7 @@ fn deform_parcel_after_road_move( let len_after = road_vec_after.length(); if len_after > EPS_GEOM { let dir_after = road_vec_after / len_after; - let parallel = - (dir_before.x * dir_after.y - dir_before.y * dir_after.x).abs() < 1e-6; + let parallel = (dir_before.x * dir_after.y - dir_before.y * dir_after.x).abs() < 1e-6; if parallel { let new_normal = DVec2::new(-dir_after.y, dir_after.x); let perp_dist = (p_a - pa_after).dot(new_normal).abs(); @@ -379,6 +389,185 @@ fn find_frontage_index(polygon: &Polygon, road_a: DVec2, road_b: DVec2) -> Optio best.map(|(i, _)| i) } +// ----------------------------------------------------------------- +// Split-segment preserve path +// ----------------------------------------------------------------- + +fn split_segment_path( + parcels: &mut ParcelSet, + graph_before: &RoadGraph, + graph_after: &RoadGraph, + old_road: RoadId, + split_point: DVec2, + _params: &SubdivisionParams, + outcome: &mut EditOutcome, +) -> Result<(), ParcelError> { + let Some((a, b)) = graph_before.road_nodes(old_road) else { + return Err(ParcelError::UnknownEntity); + }; + let pos_a = graph_before + .node_position(a) + .ok_or(ParcelError::UnknownEntity)?; + let pos_b = graph_before + .node_position(b) + .ok_or(ParcelError::UnknownEntity)?; + // Find the new node m in graph_after at split_point and the two + // new roads it splits the old road into. + let mut new_node: Option = None; + for (nid, node) in &graph_after.nodes { + if (node.pos - split_point).length() < 0.01 { + new_node = Some(nid); + break; + } + } + let m = new_node.ok_or(ParcelError::InconsistentEdit("split node not found".into()))?; + let r1 = graph_after + .find_road_between(a, m) + .ok_or(ParcelError::InconsistentEdit( + "split road r1 missing".into(), + ))?; + let r2 = graph_after + .find_road_between(m, b) + .ok_or(ParcelError::InconsistentEdit( + "split road r2 missing".into(), + ))?; + + let road_vec = pos_b - pos_a; + let road_len_sq = road_vec.length_squared(); + if road_len_sq < EPS_GEOM * EPS_GEOM { + return Err(ParcelError::InconsistentEdit("zero-length old road".into())); + } + let t_split = (split_point - pos_a).dot(road_vec) / road_len_sq; + + let parcel_ids: Vec = parcels.parcels_on_road(old_road).collect(); + for pid in parcel_ids { + let Some(parcel) = parcels.parcels.get(pid) else { + continue; + }; + let n = parcel.polygon.len(); + let fi = parcel.frontage_edge_index; + let v = parcel.polygon.vertices(); + let p_a = v[fi]; + let p_b = v[(fi + 1) % n]; + let t_a = (p_a - pos_a).dot(road_vec) / road_len_sq; + let t_b = (p_b - pos_a).dot(road_vec) / road_len_sq; + let (t_lo, t_hi) = if t_a < t_b { (t_a, t_b) } else { (t_b, t_a) }; + + if t_hi <= t_split + EPS_GEOM { + // Frontage entirely on the a-side → r1. + // No geometric change; just rebind frontage_road. + rebind_frontage_road(parcels, pid, r1); + outcome.deformed.push(pid); + } else if t_lo >= t_split - EPS_GEOM { + // Frontage entirely on the b-side → r2. + rebind_frontage_road(parcels, pid, r2); + outcome.deformed.push(pid); + } else { + // Frontage spans the split → cut into two. + // Only handle the simple 4-vertex case; fall through to + // condemn for higher-vertex parcels. + if n != 4 { + drop_parcel(parcels, pid); + outcome.condemned.push(pid); + continue; + } + let q_b = v[(fi + 2) % n]; + let q_a = v[(fi + 3) % n]; + let frontage_vec = p_b - p_a; + let len_sq = frontage_vec.length_squared(); + if len_sq < EPS_GEOM * EPS_GEOM { + drop_parcel(parcels, pid); + outcome.condemned.push(pid); + continue; + } + let t_local = (split_point - p_a).dot(frontage_vec) / len_sq; + if t_local <= EPS_GEOM || t_local >= 1.0 - EPS_GEOM { + // Split coincident with an endpoint — just rebind. + let target = if t_local <= 0.5 { r1 } else { r2 }; + rebind_frontage_road(parcels, pid, target); + outcome.deformed.push(pid); + continue; + } + let q_star = q_a + (q_b - q_a) * t_local; + // The "a side" of the split goes to r1, "b side" to r2. + // p_a is closer to a if t_a < t_b. (Polygon CCW means + // frontage goes from p_a to p_b along the road, but + // direction can be either way relative to road A→B.) + let (a_side_road, b_side_road) = if t_a < t_b { (r1, r2) } else { (r2, r1) }; + // Build new polygons. + let poly_a = Polygon::new(vec![p_a, split_point, q_star, q_a]); + let poly_b = Polygon::new(vec![split_point, p_b, q_b, q_star]); + let (Ok(poly_a), Ok(poly_b)) = (poly_a, poly_b) else { + drop_parcel(parcels, pid); + outcome.condemned.push(pid); + continue; + }; + let block = parcel.block; + let area_a = poly_a.area(); + let area_b = poly_b.area(); + let parcel_owned = parcels + .parcels + .remove(pid) + .ok_or(ParcelError::UnknownEntity)?; + if let Some(v) = parcels.by_block.get_mut(&parcel_owned.block) { + v.retain(|&x| x != pid); + } + if let Some(v) = parcels.by_road.get_mut(&parcel_owned.frontage_road) { + v.retain(|&x| x != pid); + } + outcome.condemned.push(pid); + // Building stays with the larger half. + let mut building_a: Option = None; + let mut building_b: Option = None; + if area_a >= area_b { + building_a = parcel_owned.building; + } else { + building_b = parcel_owned.building; + } + let edge_kinds = crate::parcel::classify::classify_edges(4, 0); + let new_a = Parcel { + polygon: poly_a, + edge_kinds: edge_kinds.clone(), + frontage_road: a_side_road, + frontage_edge_index: 0, + block, + building: building_a, + }; + let new_b = Parcel { + polygon: poly_b, + edge_kinds, + frontage_road: b_side_road, + frontage_edge_index: 0, + block, + building: building_b, + }; + let new_a_id = parcels.insert(new_a); + let new_b_id = parcels.insert(new_b); + outcome.created.push(new_a_id); + outcome.created.push(new_b_id); + } + } + Ok(()) +} + +fn rebind_frontage_road(parcels: &mut ParcelSet, pid: ParcelId, new_road: RoadId) { + let old_road = if let Some(p) = parcels.parcels.get(pid) { + p.frontage_road + } else { + return; + }; + if old_road == new_road { + return; + } + if let Some(p) = parcels.parcels.get_mut(pid) { + p.frontage_road = new_road; + } + if let Some(v) = parcels.by_road.get_mut(&old_road) { + v.retain(|&x| x != pid); + } + parcels.by_road.entry(new_road).or_default().push(pid); +} + // ----------------------------------------------------------------- // Delete-segment path: condemn + regenerate-block // ----------------------------------------------------------------- diff --git a/road_parceling/src/parcel/subdivide.rs b/road_parceling/src/parcel/subdivide.rs index 9698bf9..03a6f23 100644 --- a/road_parceling/src/parcel/subdivide.rs +++ b/road_parceling/src/parcel/subdivide.rs @@ -184,8 +184,7 @@ pub(crate) fn subdivide_block( let real_corner: Vec = (0..n) .map(|i| { - is_real_corner(graph, block, i, params) - && interior_angles[i] > 60.0_f64.to_radians() + is_real_corner(graph, block, i, params) && interior_angles[i] > 60.0_f64.to_radians() }) .collect(); // Acute corners: real corners (degree-3 or sharp degree-2) with @@ -194,8 +193,7 @@ pub(crate) fn subdivide_block( // separated. let acute_corner: Vec = (0..n) .map(|i| { - is_real_corner(graph, block, i, params) - && interior_angles[i] <= 60.0_f64.to_radians() + is_real_corner(graph, block, i, params) && interior_angles[i] <= 60.0_f64.to_radians() }) .collect(); @@ -405,9 +403,7 @@ pub(crate) fn subdivide_block( let mut working = raw_poly; if acute_corner[i] { if let Some(b) = corner_bisector(&verts, i) { - if let Some(clipped) = - clip_with_bisector(&working, verts[i], b, frontage_mid) - { + if let Some(clipped) = clip_with_bisector(&working, verts[i], b, frontage_mid) { working = clipped; } else { continue; diff --git a/road_parceling/tests/degenerate.rs b/road_parceling/tests/degenerate.rs index 65c6aab..a7cd269 100644 --- a/road_parceling/tests/degenerate.rs +++ b/road_parceling/tests/degenerate.rs @@ -55,17 +55,45 @@ fn assert_invariants_i1_i3(parcels: &road_parceling::ParcelSet) { // ---------------------------------------------------------------------- #[test] -#[ignore = "milestone-0.2: sliver-merge logic for acute corners"] fn acute_intersection_15deg() { - // Two roads sharing a node meet at 15°. Sliver-corner parcels - // must merge with neighbors; I1–I3 must hold. + // Two roads sharing a node meet at 15°. With the bisector-clip + // at acute corners (milestone 0.3), no proper sliver-merge yet, + // but I1–I3 must hold. + let mut g = RoadGraph::new(); + let apex = g.add_node(DVec2::new(0.0, 0.0)); + let p1 = g.add_node(DVec2::new(100.0, 0.0)); + let angle = 15.0_f64.to_radians(); + let p2 = g.add_node(DVec2::new(100.0 * angle.cos(), 100.0 * angle.sin())); + g.add_road(apex, p1).unwrap(); + g.add_road(apex, p2).unwrap(); + g.add_road(p1, p2).unwrap(); + g.rebuild_topology().unwrap(); + let params = SubdivisionParams::default(); + let parcels = subdivide_all(&g, ¶ms).unwrap(); + // We don't insist parcels exist (a 15° wedge may be too narrow + // for any parcel to satisfy `min_area`), but if any do, they + // must satisfy I1–I3. + assert_invariants_i1_i3(&parcels); } #[test] -#[ignore = "milestone-0.2: sliver-merge or typed error for knife-edge angles"] fn acute_intersection_5deg() { - // Knife-edge angle. Library must not panic; either typed error - // or valid output is acceptable. + // Knife-edge 5° angle. Library must not panic. + let mut g = RoadGraph::new(); + let apex = g.add_node(DVec2::new(0.0, 0.0)); + let p1 = g.add_node(DVec2::new(100.0, 0.0)); + let angle = 5.0_f64.to_radians(); + let p2 = g.add_node(DVec2::new(100.0 * angle.cos(), 100.0 * angle.sin())); + g.add_road(apex, p1).unwrap(); + g.add_road(apex, p2).unwrap(); + g.add_road(p1, p2).unwrap(); + g.rebuild_topology().unwrap(); + let params = SubdivisionParams::default(); + // Either succeeds with valid parcels or returns a typed error; + // both are acceptable, but it must not panic. + if let Ok(parcels) = subdivide_all(&g, ¶ms) { + assert_invariants_i1_i3(&parcels); + } } #[test] @@ -356,9 +384,53 @@ fn road_delete_condemns() { } #[test] -#[ignore = "milestone-0.2: split-segment must preserve, not regenerate"] fn road_split_preserves() { - // Splitting a segment should preserve the parcels on it. + // Splitting a segment should preserve the parcels on it. Each + // pre-split parcel either stays (frontage rebinds to one of the + // two new roads) or is split into two parcels along the + // perpendicular through the split point. + let mut g = rectangle_graph(200.0, 100.0); + let params = SubdivisionParams::default(); + let mut parcels = subdivide_all(&g, ¶ms).unwrap(); + let pre_count = parcels.len(); + + // Pick the bottom road (longest, has many parcels) and split at + // x = 100, y = 0. + let bottom_road = g + .road_endpoints() + .find(|&(_, _, b)| { + let pos = g.node_position(b).unwrap(); + pos.y.abs() < 1e-6 && pos.x > 100.0 + }) + .map(|(rid, _, _)| rid) + .unwrap(); + + let outcome = apply_road_edit( + &mut parcels, + &mut g, + RoadEdit::SplitSegment { + road: bottom_road, + at: DVec2::new(100.0, 0.0), + }, + ¶ms, + ) + .unwrap(); + // Most parcels should be deformed (frontage_road rebound, no + // geometric change). At most one is condemned (the one whose + // frontage spans the split point — and it gets two replacements). + assert!( + outcome.regenerated.is_empty(), + "split path must not trigger block regenerate; got {} regenerated", + outcome.regenerated.len() + ); + assert!( + !outcome.deformed.is_empty(), + "split path should preserve at least some parcels" + ); + // Net parcel count should be ≥ pre_count (a split can ADD + // parcels but never lose them outright). + assert!(parcels.len() >= pre_count - 1); + assert_invariants_i1_i3(&parcels); } #[test] @@ -507,17 +579,19 @@ fn y_intersection_no_overlaps() { let parcels = subdivide_all(&g, ¶ms).unwrap(); let parcels_vec: Vec<_> = parcels.iter().collect(); - for i in 0..parcels_vec.len() { - let centroid_i = parcels_vec[i].1.polygon().centroid(); - for j in 0..parcels_vec.len() { + for (i, (_, pi)) in parcels_vec.iter().enumerate() { + let centroid_i = pi.polygon().centroid(); + for (j, (_, pj_pair)) in parcels_vec.iter().enumerate() { if i == j { continue; } - let pj = parcels_vec[j].1.polygon(); + let pj = pj_pair.polygon(); assert!( !pj.contains(centroid_i), "I3 violation: centroid of parcel {} ({:?}) is inside parcel {}", - i, centroid_i, j + i, + centroid_i, + j ); } }