bab83bce5f0db62862193ff0b47f2f23b94cfe30
Fixrunde 2 zu Task 11, zwei von der Koordination beim Bau von Gegenbeispielen gefundene Fehler in insert_edge() aus Fixrunde 1, einer davon schon in den echten Daten nachweisbar: 1. attach() darf einen bis zu JUNCTION_RADIUS (8 m) entfernten Knoten wiederverwenden, aber _add_piece() übernahm dessen ID in a/b, ohne den zugehörigen Endpunkt in points auf die Knotenkoordinate zu ziehen - die Kante hing dadurch an einem Punkt, an dem sie geometrisch gar nicht lag. Am echten Netz endete die Jefferson Avenue so 6,65 m neben Knoten 561, an dem sie laut Graph hängt; section.py baut die Kreuzungsarme in junction_arms() aus genau diesen Endpunkten. Behoben wie _contract_short() es seit Task 4 vormacht: den betroffenen Endpunkt durch die Knotenkoordinate ersetzen, die Kante bekommt dadurch einen kurzen Knick zum Knoten. Neue Invariante über den ganzen Graphen (test_roads_insert.py): points[0] == nodes[a].point und points[-1] == nodes[b].point für jede Kante. 2. _crossing_points() kannte nur Point und MultiPoint. Überlappt die neue Linie eine Bestandskante ein Stück weit und kreuzt sie danach an einer anderen Stelle wirklich, liefert intersection() eine GeometryCollection aus der Überlappung (LineString) und dem echten Kreuzungspunkt (Point) - die wurde bisher komplett verworfen, samt Kreuzungspunkt. Jetzt werden aus jeder Geometrie (Point, MultiPoint oder GeometryCollection) nur die Point-Anteile behalten. Festgehalten, nicht geändert: Kreuzt die neue Linie zwei verschiedene Kanten näher als JUNCTION_RADIUS zueinander, verschmelzen beide zu einem Knoten - dieselbe Regel, mit der _junction_clusters() beim Netzaufbau aus dem Skelett benachbarte Kreuzungspixel zusammenfasst. Mit Fix 1 knickt die zweite beteiligte Kante jetzt sauber zu diesem gemeinsamen Knoten statt knapp daneben zu enden. test_park_street.py zieht die Kreuzungsgrad-Zusicherung von ">= 3" auf "== 4" an, weil an einer echten Kreuzung zweier gespaltener Straßen genau das gilt. Am echten Netz nachgemessen: Die Jefferson Avenue endet jetzt exakt auf Knoten 561 (1551,67 | 332,67), nicht mehr 6,65 m daneben; die vier von insert_edge() neu geschriebenen Kanten haben 0,000000 m Lücke zu ihrem Knoten. Eine bereits vor Flamingo Park bestehende Rundungsdifferenz zwischen unrundeten Knotenkoordinaten aus _junction_clusters() und den auf 2 Dezimalstellen gerundeten Kantenpunkten aus clean() betrifft ~1.250 von 1.790 Kanten mit höchstens 7,1 mm Abstand, unverändert vorher wie nachher - das ist keine Folge dieser beiden Fixe und liegt außerhalb des heutigen Umfangs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Languages
TypeScript
44.1%
JavaScript
40.9%
Python
11.2%
HTML
3.3%
CSS
0.5%