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:
1 parent
f809eedf71
commit
2d8f4e730c
2 files changed
+48
-3
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user