Vector Art: boolesche Operationen (Vereinigen, Abziehen, Schneiden) #187

Closed
opened 2026-09-20 19:46:47 +02:00 by meleki · 2 comments
Owner

Folge-Issue aus #129 (Frage 6, Antwort: „auch boolesche Operationen als Folge-Issue").

Befund

Seit #129 ist eine Form eine flache Liste von Ringen mit Even-Odd-Regel — ein Loch entsteht durch einen zweiten Ring. Formen zu vereinigen, abzuziehen, zu schneiden oder auszuschließen geht nicht.

Zu bauen (Vorschlag)

  • Zwei oder mehr ausgewählte Formen: Vereinigen, Abziehen, Schneiden, Ausschließen.
  • Das Ergebnis ist wieder eine gewöhnliche Form (Ringe aus Punkten) — kein neuer Modelltyp, kein nachträglich veränderbarer Verbund. Wer das Ergebnis ändern will, macht es rückgängig.
  • Die Rechnung läuft auf den abgetasteten Pfaden (Bezier zu Polylinie), das Ergebnis besteht danach aus Ecken. Ob Kurven erhalten bleiben sollen, ist eine eigene Frage.

Offen

  • Eigene Umsetzung oder eine Bibliothek (z. B. polygon-clipping)? Bisher hat das Projekt keine Abhängigkeit dieser Art.
Folge-Issue aus #129 (Frage 6, Antwort: „auch boolesche Operationen als Folge-Issue"). ## Befund Seit #129 ist eine Form eine flache Liste von Ringen mit Even-Odd-Regel — ein Loch entsteht durch einen zweiten Ring. Formen zu **vereinigen**, **abzuziehen**, zu **schneiden** oder **auszuschließen** geht nicht. ## Zu bauen (Vorschlag) - Zwei oder mehr ausgewählte Formen: **Vereinigen**, **Abziehen**, **Schneiden**, **Ausschließen**. - Das Ergebnis ist wieder eine gewöhnliche Form (Ringe aus Punkten) — **kein** neuer Modelltyp, kein nachträglich veränderbarer Verbund. Wer das Ergebnis ändern will, macht es rückgängig. - Die Rechnung läuft auf den **abgetasteten** Pfaden (Bezier zu Polylinie), das Ergebnis besteht danach aus Ecken. Ob Kurven erhalten bleiben sollen, ist eine eigene Frage. ## Offen - Eigene Umsetzung oder eine Bibliothek (z. B. polygon-clipping)? Bisher hat das Projekt keine Abhängigkeit dieser Art.
meleki added the new label 2026-09-20 19:46:47 +02:00
admin added this to the Development project 2026-09-20 19:48:04 +02:00
admin removed the new label 2026-09-21 06:15:03 +02:00

Zur Frage: was wäre klüger? wenn es zu aufwendig ist, dann kann man ruhig eine Bibliothek verwenden.

Zur Frage: was wäre klüger? wenn es zu aufwendig ist, dann kann man ruhig eine Bibliothek verwenden.
admin moved this to Next in Development on 2026-09-21 08:01:50 +02:00
Author
Owner

Umgesetzt in 1116818, Wiki b07676c (Vector Art, Architecture, Development).

Was dazukommt

Im Inspector gibt es unter der Formenliste den Block COMBINE mit Union, Subtract, Intersect und Exclude.

  • Mehrere Formen wählen: im Tab mit Strg/Cmd+Klick (Umschalt bleibt dort Pan), in der Liste mit Strg oder Umschalt. Ein normaler Klick wählt wieder nur eine Form. Die mitgewählten Formen zeigen ihren Umriss, Punkte und Griffe hat nur die zuletzt geklickte.
  • Das Ergebnis ersetzt die unterste gewählte Form: Name, Farbe, Kontur und Platz in der Reihenfolge bleiben, die anderen Formen verschwinden. Subtract zieht alle oberen Formen von der untersten ab.
  • Ein Undo-Schritt, heraus kommt eine gewöhnliche Form.
  • Kurven werden zu Ecken, abgetastet auf 0,2 Leinwandpixel (ein Kreis bekommt etwa 48 Punkte).
  • Nicht möglich mit nur einer Form oder mit einer offenen Linie: die Knöpfe sind dann aus, der Grund steht darunter. Ein leeres Ergebnis (z. B. Intersect ohne Überlappung) wird mit Meldung abgelehnt.
  • Nebenbei: Delete entfernt alle gewählten Formen, und die Auswahl lässt gelöschte Formen fallen.

Bibliothek

clipper2-ts@2.0.1, exakt gepinnt: Boost-Lizenz, keine Abhängigkeiten, TypeScript, kennt Even-Odd direkt. Importiert wird nur die Engine, das Bundle wächst um 55 kB (998 → 1053 kB) statt 110 kB.

Verworfen: clipper2-js, es zieht Angular 15 mit, npm audit meldet dazu high ohne Fix.

Fund

Pixi erkennt Löcher über Enthaltensein, nicht über Even-Odd. Eine Insel in einem Loch würde wieder als Loch gezeichnet. Die Ergebnisringe kommen deshalb in einer Reihenfolge heraus, die Pixi richtig zeichnet, ein Test bildet Pixis Regel nach.

Bewusst nicht gebaut

  • Kurven bleiben nicht erhalten (war im Issue als eigene Frage offen).
  • Mehrere gewählte Formen zusammen verschieben.

Tests

./check.sh              → 134 Files, 1986 Tests, exit 0   (vorher 133 / 1968)
npm run build           → exit 0
GM_STEPS=47 (frisch)    → ALL PASSED – 44 checks   (vorher 39)
  • 18 neue Unit-Tests: Flächen aller vier Operationen nach Even-Odd, Insel im Loch, Kreis-Toleranz, Sperrgründe, Command mit Undo/Redo, Mehrfachauswahl und Inspector-Knöpfe.
  • 5 neue e2e-Checks (47h): Klick, Strg+Klick, Subtract über den Knopf (L-Form, 6 Ecken, Fläche 7600), Pixel im Tab, Undo.
  • Fünf Gegenproben greifen. Eine Sortierung nach Tiefe war toter Code und ist entfernt. Ein Pixel-Check wurde geschärft, weil er ohne Abzug grün blieb.
  • Check-Summe 1222 in README und Wiki, gerechnet (1217 + 5); gemessen wird sie in CI.
Umgesetzt in 1116818, Wiki b07676c (Vector Art, Architecture, Development). ## Was dazukommt Im Inspector gibt es unter der Formenliste den Block **COMBINE** mit **Union**, **Subtract**, **Intersect** und **Exclude**. - **Mehrere Formen wählen:** im Tab mit Strg/Cmd+Klick (Umschalt bleibt dort Pan), in der Liste mit Strg oder Umschalt. Ein normaler Klick wählt wieder nur eine Form. Die mitgewählten Formen zeigen ihren Umriss, Punkte und Griffe hat nur die zuletzt geklickte. - **Das Ergebnis ersetzt die unterste gewählte Form:** Name, Farbe, Kontur und Platz in der Reihenfolge bleiben, die anderen Formen verschwinden. **Subtract** zieht alle oberen Formen von der untersten ab. - **Ein Undo-Schritt**, heraus kommt eine gewöhnliche Form. - **Kurven werden zu Ecken**, abgetastet auf 0,2 Leinwandpixel (ein Kreis bekommt etwa 48 Punkte). - **Nicht möglich** mit nur einer Form oder mit einer offenen Linie: die Knöpfe sind dann aus, der Grund steht darunter. Ein leeres Ergebnis (z. B. Intersect ohne Überlappung) wird mit Meldung abgelehnt. - **Nebenbei:** Delete entfernt alle gewählten Formen, und die Auswahl lässt gelöschte Formen fallen. ## Bibliothek `clipper2-ts@2.0.1`, exakt gepinnt: Boost-Lizenz, keine Abhängigkeiten, TypeScript, kennt Even-Odd direkt. Importiert wird nur die Engine, das Bundle wächst um 55 kB (998 → 1053 kB) statt 110 kB. Verworfen: `clipper2-js`, es zieht Angular 15 mit, `npm audit` meldet dazu high ohne Fix. ## Fund Pixi erkennt Löcher über Enthaltensein, nicht über Even-Odd. Eine Insel in einem Loch würde wieder als Loch gezeichnet. Die Ergebnisringe kommen deshalb in einer Reihenfolge heraus, die Pixi richtig zeichnet, ein Test bildet Pixis Regel nach. ## Bewusst nicht gebaut - Kurven bleiben nicht erhalten (war im Issue als eigene Frage offen). - Mehrere gewählte Formen zusammen verschieben. ## Tests ``` ./check.sh → 134 Files, 1986 Tests, exit 0 (vorher 133 / 1968) npm run build → exit 0 GM_STEPS=47 (frisch) → ALL PASSED – 44 checks (vorher 39) ``` - 18 neue Unit-Tests: Flächen aller vier Operationen nach Even-Odd, Insel im Loch, Kreis-Toleranz, Sperrgründe, Command mit Undo/Redo, Mehrfachauswahl und Inspector-Knöpfe. - 5 neue e2e-Checks (47h): Klick, Strg+Klick, Subtract über den Knopf (L-Form, 6 Ecken, Fläche 7600), Pixel im Tab, Undo. - Fünf Gegenproben greifen. Eine Sortierung nach Tiefe war toter Code und ist entfernt. Ein Pixel-Check wurde geschärft, weil er ohne Abzug grün blieb. - Check-Summe 1222 in README und Wiki, gerechnet (1217 + 5); gemessen wird sie in CI.
admin moved this to Done in Development on 2026-09-21 12:19:32 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#187