Vector Art: Combine operationen droppen bezier curves #208

Closed
opened 2026-09-22 20:34:30 +02:00 by admin · 1 comment

Wie der titel schon sagt, wenn ich zB Exclude mache, dann werden alle kurven verworfen und in viele punkte umgewandelt. gibt es einen algorhythmus der das verhindert. wenn ich keine andere linie überschneide dann sollte das sowie so nicht passieren. wenn ich aber eine curve überlappe bei der operation wäre es interessant ob wir eine gute annäherung hinbekommen

Wie der titel schon sagt, wenn ich zB Exclude mache, dann werden alle kurven verworfen und in viele punkte umgewandelt. gibt es einen algorhythmus der das verhindert. wenn ich keine andere linie überschneide dann sollte das sowie so nicht passieren. wenn ich aber eine curve überlappe bei der operation wäre es interessant ob wir eine gute annäherung hinbekommen
admin added this to the Development project 2026-09-22 20:34:35 +02:00
admin moved this to Next in Development on 2026-09-22 20:34:51 +02:00
Owner

Gebaut in 6e3e8d2 — Combining vector shapes keeps the curves it did not cut (#208).

Was jetzt passiert

Beide Fälle aus dem Issue sind abgedeckt:

  • Was nichts berührt hat, kommt unverändert zurück. Ein Kreis, an dem nichts schneidet, hat nach einem Exclude wieder genau seine vier Punkte samt Handles statt 40 Ecken.
  • Was geschnitten wird, behält den echten Kurvenverlauf bis zum Schnitt. Das ist kein Fitting: Beim Abtasten merkt sich jeder Punkt, von welcher Kurve er stammt und an welcher Stelle. Läuft eine Folge von Ergebnispunkten eine dieser Kurven entlang, wird genau dieses Stück per de Casteljau wieder aus der Originalkurve herausgeschnitten.
  • Nur dort, wo die Operation wirklich eine neue Kante gezogen hat, bleibt eine Ecke. Eine gerade Schnittkante bleibt gerade, auch wenn ihre beiden Enden auf derselben Kurve sitzen — sonst würde die weggeschnittene Kappe wieder zurückbeulen.
  • Eine geschlossene Kontur behält mindestens drei Punkte, damit eine Linse nicht auf zwei zusammenfällt.
  • Die Regel liegt als eigenes Modul src/core/model/vectorCurves.ts, vectorBoolean.ts reicht nur die Tabelle der abgetasteten Punkte durch. Am Ergebnis der booleschen Operation selbst ändert sich nichts.

Wo die Grenze liegt

Die beiden Schnittpunkte selbst sitzen bis zu 0,09 Canvas-Pixel neben der Originalkurve. Clipper schneidet die abgetasteten Geradenstücke, nicht die Kurven — das war vorher genauso und liegt innerhalb der Abtast-Toleranz von 0,2 px. Ein Versuch, das mit Newton-Schritten auf der Kurve zu verbessern, hat gemessen nichts gebracht (0,02952 statt 0,02978 px), weil der Fehler nicht in der Schätzung sitzt, sondern im Schnittpunkt. Der Code ist wieder entfernt. Echte Kurven-Kurven-Schnitte wären dafür nötig, das wäre eine eigene Baustelle.

Tests

./check.sh              → 143 Files, 2133 Tests, CHECK EXIT 0   (vorher 2127)
GM_STEPS=47 (frisch)    → ALL PASSED – 59 checks                (vorher 57)
npm run build           → BUILD EXIT 0
  • 6 neue Unit-Tests in tests/core/vector-boolean.test.ts: unberührter Kreis, unberührte Seite plus gerade Schnittkante, Schnitt mitten in der Kurve, Sehne die eine Kurve zweimal schneidet, zwei überlappende Kreise, Linse mit dem Drei-Punkte-Minimum. Der alte Test, der ausdrücklich „keine Handles" verlangte, ist umgeschrieben.
  • 2 neue e2e-Checks (Block 47p): Kreis minus Quadrat im Tab, Punktzahl und Handles aus dem Modell, dazu ein Pixelpaar auf der Rundung.
  • Vier Gegenproben, alle greifen: Rekonstruktion aus → 5 Unit-Tests und der e2e-Check fallen (35 Punkte, 0 gekrümmt); Sehnen-Prüfung aus → die Kappe beult auf 28,28 zurück; Drei-Punkte-Garantie aus → der Linsen-Test fällt; Handles halbiert → der Pixelcheck liest Hintergrund statt Grün. Originale per cmp zurückgeholt, danach neu gebaut.
  • Screenshot angesehen: die Pac-Man-Form hat eine glatte runde Kante mit wenigen Ankerpunkten, die Handles sind im Bild sichtbar.
  • Nicht abgewartet: der CI-Lauf zu 6e3e8d2. Die Check-Summe 1304 in README und Wiki ist gerechnet (zuletzt gemessen: 1293 an 1a3babf; die Läufe zu d7a2521 waren cancelled).

Im Commit steckt außerdem eine fremde Änderung aus dem Arbeitsbaum: Theme.ts rowHeight: 22 → 24. Gate und Modul 47 sind damit grün.

Doku: Wiki e21f047 — Vector Art sagt jetzt, dass Kurven überleben, die alte Grenze „Combining keeps no curves" (#187) ist aus den Known limits raus.

Gebaut in `6e3e8d2` — *Combining vector shapes keeps the curves it did not cut (#208)*. ## Was jetzt passiert Beide Fälle aus dem Issue sind abgedeckt: - **Was nichts berührt hat, kommt unverändert zurück.** Ein Kreis, an dem nichts schneidet, hat nach einem Exclude wieder genau seine vier Punkte samt Handles statt 40 Ecken. - **Was geschnitten wird, behält den echten Kurvenverlauf bis zum Schnitt.** Das ist kein Fitting: Beim Abtasten merkt sich jeder Punkt, von welcher Kurve er stammt und an welcher Stelle. Läuft eine Folge von Ergebnispunkten eine dieser Kurven entlang, wird genau dieses Stück per de Casteljau wieder aus der Originalkurve herausgeschnitten. - **Nur dort, wo die Operation wirklich eine neue Kante gezogen hat, bleibt eine Ecke.** Eine gerade Schnittkante bleibt gerade, auch wenn ihre beiden Enden auf derselben Kurve sitzen — sonst würde die weggeschnittene Kappe wieder zurückbeulen. - Eine geschlossene Kontur behält mindestens drei Punkte, damit eine Linse nicht auf zwei zusammenfällt. - Die Regel liegt als eigenes Modul `src/core/model/vectorCurves.ts`, `vectorBoolean.ts` reicht nur die Tabelle der abgetasteten Punkte durch. Am Ergebnis der booleschen Operation selbst ändert sich nichts. ## Wo die Grenze liegt **Die beiden Schnittpunkte selbst sitzen bis zu 0,09 Canvas-Pixel neben der Originalkurve.** Clipper schneidet die abgetasteten Geradenstücke, nicht die Kurven — das war vorher genauso und liegt innerhalb der Abtast-Toleranz von 0,2 px. Ein Versuch, das mit Newton-Schritten auf der Kurve zu verbessern, **hat gemessen nichts gebracht** (0,02952 statt 0,02978 px), weil der Fehler nicht in der Schätzung sitzt, sondern im Schnittpunkt. Der Code ist wieder entfernt. Echte Kurven-Kurven-Schnitte wären dafür nötig, das wäre eine eigene Baustelle. ## Tests ``` ./check.sh → 143 Files, 2133 Tests, CHECK EXIT 0 (vorher 2127) GM_STEPS=47 (frisch) → ALL PASSED – 59 checks (vorher 57) npm run build → BUILD EXIT 0 ``` - **6 neue Unit-Tests** in `tests/core/vector-boolean.test.ts`: unberührter Kreis, unberührte Seite plus gerade Schnittkante, Schnitt mitten in der Kurve, Sehne die eine Kurve zweimal schneidet, zwei überlappende Kreise, Linse mit dem Drei-Punkte-Minimum. Der alte Test, der ausdrücklich „keine Handles" verlangte, ist umgeschrieben. - **2 neue e2e-Checks (Block 47p):** Kreis minus Quadrat im Tab, Punktzahl und Handles aus dem Modell, dazu ein Pixelpaar auf der Rundung. - **Vier Gegenproben, alle greifen:** Rekonstruktion aus → 5 Unit-Tests und der e2e-Check fallen (35 Punkte, 0 gekrümmt); Sehnen-Prüfung aus → die Kappe beult auf 28,28 zurück; Drei-Punkte-Garantie aus → der Linsen-Test fällt; Handles halbiert → der Pixelcheck liest Hintergrund statt Grün. Originale per `cmp` zurückgeholt, danach neu gebaut. - **Screenshot angesehen:** die Pac-Man-Form hat eine glatte runde Kante mit wenigen Ankerpunkten, die Handles sind im Bild sichtbar. - **Nicht abgewartet:** der CI-Lauf zu `6e3e8d2`. Die Check-Summe **1304** in README und Wiki ist gerechnet (zuletzt gemessen: 1293 an `1a3babf`; die Läufe zu `d7a2521` waren `cancelled`). Im Commit steckt außerdem eine fremde Änderung aus dem Arbeitsbaum: `Theme.ts` `rowHeight: 22 → 24`. Gate und Modul 47 sind damit grün. Doku: Wiki `e21f047` — *Vector Art* sagt jetzt, dass Kurven überleben, die alte Grenze „Combining keeps no curves" (#187) ist aus den *Known limits* raus.
admin moved this to Done in Development on 2026-09-23 05:33:49 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#208