fix(extract): Regressionsschutz für edges-Sortierschlüssel, _line()-Docstring berichtigt

Fixrunde 1 zu Task 10 (Rückmeldung des Koordinators). Zwei Punkte:

Die edges-Korrektur aus dem Hauptcommit (Sortierschlüssel deckte nur (line, klasse) ab,
nicht breite/fahrbahn) hatte keinen committeten Regressionstest - nur eine Ad-hoc-Probe,
die nicht mitkam. Drei Tests ergänzt: zwei edges-Einträge mit gleicher Linie/Klasse aber
unterschiedlicher Breite in beiden Reihenfolgen (der eigentliche Regressionsschutz - mit
dem alten zweiteiligen Schlüssel probeweise reproduziert, um die Fehlermeldung zu belegen,
dann zurückgestellt), zwei bridges-Einträge in beiden Reihenfolgen, und eine Linie gegen
ihre exakte Umkehrung einmal als curb, einmal als edges - das ist die Zusicherung, auf der
_line()s ganze Normalisierung beruht, und stand bisher nirgends als Test.

_line()-Docstring behauptete im Präsens, Laternen wählten ihre Seite schon aus der
Kantenrichtung statt aus der Listenposition. Das stimmt nicht: src/world/props.js:107
wählt weiterhin über den geraden/ungeraden Index (vergeLampPoints(), liest
chunk.centerlines/chunk.roads). Docstring jetzt als Bedingung formuliert - was
vorausgesetzt wird und wo es eingelöst wird (eine geometriebasierte Nachfolgefunktion in
props.js, im Plan als sidewalkLampPoints() vorgesehen) - statt als Tatsachenbehauptung,
und ohne Aufgabennummer im Kommentar.

overview.py, geometry.js und props.js bewusst nicht angefasst (Koordinator: das ist
Sache der Aufgaben 13-15).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-17 10:09:27 +02:00
1 parent f97b7d9c81
commit 887cb09433
2 files changed
+64 -5

No files matched your search

+12 -5
View File
@@ -74,11 +74,18 @@ def _sorted_surfaces(entries: list[dict]) -> list[dict]:
def _line(line, i: int, j: int) -> list[list[float]]:
"""Ein Linienzug in Chunk-Koordinaten, richtungsunabhängig festgelegt.
normalize() dreht eine Linie in eine feste Laufrichtung. Das ist hier anders als bei den
früheren centerlines erwünscht: Die Laternen wählen ihre Seite seit Teil 2 aus der
Kantenrichtung *und* prüfen gegen die Gehwegfläche, hängen also nicht mehr an der
Listenposition (siehe props.js). Damit darf die Ausgabe sortiert und normalisiert werden,
und ein Lauf erzeugt wieder Datei für Datei dasselbe.
normalize() dreht eine Linie in eine feste Laufrichtung. Normalisieren und Sortieren ist für
curb und edges nur zulässig, solange keine Laterne ihre Straßenseite aus der Listenposition
wählt, sondern aus der Geometrie - Kantenrichtung und eine Prüfung gegen die Gehwegfläche.
Bei den früheren centerlines war das nicht so, deshalb blieben sie unsortiert und
unnormalisiert.
Eingelöst wird die Voraussetzung erst mit einer geometriebasierten Nachfolgefunktion in
props.js (vorgesehen als sidewalkLampPoints(), als Ablösung von vergeLampPoints()). Heute
liest dort noch niemand curb oder edges: vergeLampPoints() wählt die Seite weiterhin über den
geraden/ungeraden Index (Zeile 107) und läuft auf chunk.centerlines/chunk.roads. Bis zur
Ablösung ist das hier deshalb folgenlos - nicht weil die Bedingung gälte, sondern weil noch
kein Verbraucher zuhört.
"""
ox = SLICE["x0"] + i * CHUNK_SIZE
oy = SLICE["y1"] - j * CHUNK_SIZE