From 0bf2c290610d426ad8a9023367e0e2a88dcd3e67 Mon Sep 17 00:00:00 2001 From: KNSO Date: Sat, 12 Sep 2026 17:41:43 +0200 Subject: [PATCH] fix: leere Zusicherung und mutierende Ringumkehr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Zusicherung im Löcher-Test stand mit "or True" in meiner eigenen Fix-Vorgabe und prüfte damit nichts; ersetzt durch zwei Zusicherungen, die die Lage des Lochs im Außenring tatsächlich belegen. Im Planentwurf zu Task 7 hätte clockwise(hole).reverse() die Eingabe des Aufrufers verändert, weil clockwise() denselben Array zurückgibt, wenn der Ring schon passt. Co-Authored-By: Claude Opus 5 --- docs/superpowers/plans/2026-09-12-leonida-vice-slice.md | 8 ++++++-- tools/extract/tests/test_emit.py | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/superpowers/plans/2026-09-12-leonida-vice-slice.md b/docs/superpowers/plans/2026-09-12-leonida-vice-slice.md index 12e086f..d274378 100644 --- a/docs/superpowers/plans/2026-09-12-leonida-vice-slice.md +++ b/docs/superpowers/plans/2026-09-12-leonida-vice-slice.md @@ -1806,7 +1806,9 @@ export function flatPolygons(polygons, { y = 0, uvScale = 8 } = {}) { const pos = [], idx = [], uv = []; for (const raw of polygons) { const outer = clockwise(raw[0]); - const holes = raw.slice(1).map((hole) => clockwise(hole).reverse()); + // clockwise() gibt denselben Array zurueck, wenn der Ring schon passt — deshalb + // vor dem Umdrehen kopieren, sonst wird die Eingabe des Aufrufers veraendert. + const holes = raw.slice(1).map((hole) => [...clockwise(hole)].reverse()); const base = pos.length / 3; for (const ring of [outer, ...holes]) { for (const [x, z] of ring) { @@ -1828,7 +1830,9 @@ export function extrudePolygons(polygons, { base = 0, top = 10, uvScale = 4, tin // Jede Fläche ist eine Liste von Ringen: Außenring zuerst, danach die Löcher. // triangulateShape erwartet die Löcher gegenläufig zum Außenring. const outer = clockwise(raw[0]); - const holes = raw.slice(1).map((hole) => clockwise(hole).reverse()); + // clockwise() gibt denselben Array zurueck, wenn der Ring schon passt — deshalb + // vor dem Umdrehen kopieren, sonst wird die Eingabe des Aufrufers veraendert. + const holes = raw.slice(1).map((hole) => [...clockwise(hole)].reverse()); for (const ring of [outer, ...holes]) { const n = ring.length; for (let i = 0; i < n; i++) { diff --git a/tools/extract/tests/test_emit.py b/tools/extract/tests/test_emit.py index 9c3011e..6e363a0 100644 --- a/tools/extract/tests/test_emit.py +++ b/tools/extract/tests/test_emit.py @@ -33,8 +33,10 @@ def test_polygon_holes_survive_into_the_payload(): assert len(payload["land"]) == 1 rings = payload["land"][0] assert len(rings) == 2 # Aussenring und Loch - assert len(rings[0]) > len(rings[1]) or True - hole = rings[1] + exterior, hole = rings + # Das Loch liegt innerhalb des Aussenrings, nicht daneben. + assert min(x for x, _ in exterior) < min(x for x, _ in hole) + assert max(x for x, _ in exterior) > max(x for x, _ in hole) assert all(0 <= x <= 250 and 0 <= z <= 250 for x, z in hole) def test_split_by_chunk_all_yields_polygons_for_a_multi_part_intersection():