fix(extract): Kontraktion zieht jetzt alle anliegenden Kanten mit

_contract_short() ließ Kanten, die schon vorher am überlebenden Knoten
hingen, auf ihrer alten Koordinate stehen - nur die vom eingezogenen
Knoten umgehängten folgten dem neuen Mittelpunkt. Da Kontraktion beidseitig
Grad >= 3 voraussetzt, hat der überlebende Knoten danach immer mindestens
Grad 4, und _merge_chains() fasst nur Grad-2-Knoten an: Der Fehler konnte
sich nie von selbst heilen. Am heutigen Mosaik wirkungslos (die Funktion
greift dort kein einziges Mal), aber real für jeden Ausschnitt mit zwei
nahen Kreuzungen - genau der Fall, den die Funktion behandeln soll.

Dazu zwei Kleinigkeiten: _median_width() deckte den Kurzkanten-Fallback
(unter 2 * WIDTH_MARGIN) bisher nicht ab, und ein Kommentar in
_merge_chains() war ein Zeichen zu weit eingerückt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-17 01:52:19 +02:00
1 parent f809eedf71
commit 2d8f4e730c
2 files changed
+48 -3

No files matched your search

+6 -2
View File
@@ -213,7 +213,7 @@ def _merge_chains(graph: Graph) -> None:
first, second = (graph.edges[i] for i in incident)
if first.a == first.b or second.a == second.b:
continue # eine Schleife (z.B. ein kleiner Ring am Skelett) hat kein
# zweites Ende - mit der Nachbarkante lässt sie sich nicht verketten
# zweites Ende - mit der Nachbarkante lässt sie sich nicht verketten
points = _join(first, second, graph.nodes[node].point)
if points is None:
continue
@@ -251,9 +251,13 @@ def _contract_short(graph: Graph) -> None:
for other in graph.edges:
if other.a == edge.b:
other.a = edge.a
other.points = [graph.nodes[edge.a].point, *other.points[1:]]
if other.b == edge.b:
other.b = edge.a
# Auch die Kanten, die schon vorher am überlebenden Knoten hingen, müssen ihm
# folgen: Er ist gerade auf den Mittelpunkt zwischen beiden Kreuzungen gewandert.
if other.a == edge.a:
other.points = [graph.nodes[edge.a].point, *other.points[1:]]
if other.b == edge.a:
other.points = [*other.points[:-1], graph.nodes[edge.a].point]
changed = True
break