009 - Colors

Das Color System bietet Farbpaletten und Utilities.

Warum ein Farbsystem?

Farben sind in generativer Kunst essenziell – aber auch tückisch:

  • Harmonien sind schwer – Welche Farben passen zusammen?
  • Wechsel soll einfach sein – "Jetzt mal andere Palette"
  • Konsistenz – Alle Agenten sollen dieselbe Palette nutzen

Die Lösung: ColorSet

Das ColorSet ist ein Paletten-Manager. Du definierst mehrere Farbpaletten, und das System:

  • Verwaltet die aktuelle Palette
  • Ermöglicht Cycling (nächste Palette) per Tastendruck oder Timer
  • Feuert Events, wenn sich die Palette ändert
  • Bietet Tweakpane-UI zum Wechseln

Warum Events? Weil Agenten nicht ständig pollen sollen "Hat sich die Farbe geändert?". Sie subscriben colorset:changed und werden benachrichtigt.

Warum Auto-Cycling? Für Ausstellungen: Alle 30 Sekunden andere Farben, ganz ohne Interaktion. Das Artwork "lebt".

Komponenten

Klasse Datei Funktion
ColorSet ColorSet.ts Farbpaletten-Manager
ColorUtils ColorUtils.ts Farb-Utilities

ColorSet

Verwaltet Farbpaletten mit Cycling und Events.

Konzept:

                                      ┌────────────────┐
                                 ┌───▶│   Palette 1    │
                                 │    └────────────────┘
                                 │    ┌────────────────┐
                    ┌────────────┼───▶│   Palette 2    │
                    │            │    └────────────────┘
    ┌───────────┐   │            │    ┌────────────────┐
    │  ColorSet │───┤            └───▶│   Palette 3    │
    └───────────┘   │                 └────────────────┘
                    │
                    │ getCurrent()    ┌──────────────────┐
                    ├────────────────▶│ Aktuelle Palette │
                    │                 └──────────────────┘
                    │ cycle()         ┌──────────────────┐
                    ├────────────────▶│ Nächste Palette  │
                    │                 └──────────────────┘
                    │ event           ┌──────────────────┐
                    └────────────────▶│ colorset:changed │
                                      └──────────────────┘

Initialisierung:

ColorSet.ensureParameterSet(parameter, [
  ['#FF0000', '#00FF00', '#0000FF'],  // Palette 1
  ['#FFFF00', '#FF00FF', '#00FFFF'],  // Palette 2
]);

API:

Methode Beschreibung
getCurrent() Aktuelle Palette
getIndex() Aktueller Index
setIndex(i) Palette wählen
cycle() Nächste Palette
getColor(i) Farbe aus Palette
getRandomColor() Zufällige Farbe
fill(ctx, i) Canvas-Fill setzen
stroke(ctx, i) Canvas-Stroke setzen

Rückgabe-Typen:

Typ Beschreibung
CS_Result { color, index, colorIndex }
CS_Result_String Nur der Farbstring
CS_ResultColorInfo Mit RGB-Komponenten

Events:

Event Payload Auslöser
colorset:changed { colors, id, index } Palette wechselt

Auto-Cycling

ColorSet kann automatisch Paletten wechseln.

Parameter:

Parameter Typ Beschreibung
animation boolean Auto-Cycle aktiv?
animationInterval number Interval (ms)
animationMode 'cycle' | 'random' Wechsel-Modus

Tweakpane Integration

Blade Funktion
Palette-Dropdown Palette wählen
Animation Toggle Auto-Cycle an/aus
Interval Slider Wechsel-Geschwindigkeit
Preview Farb-Vorschau

ColorUtils

Statische Utility-Funktionen.

Konvertierung:

Funktion Beschreibung
hexToRgb(hex) Hex → RGB
rgbToHex(r, g, b) RGB → Hex
hexToHsl(hex) Hex → HSL
hslToHex(h, s, l) HSL → Hex
hexToRgba(hex) Hex → RGBA (mit Alpha)

Manipulation:

Funktion Beschreibung
lighten(color, amount) Aufhellen
darken(color, amount) Abdunkeln
saturate(color, amount) Sättigung erhöhen
desaturate(color, amount) Sättigung reduzieren
invert(color) Invertieren
complement(color) Komplementärfarbe

Mischung:

Funktion Beschreibung
mix(color1, color2, amount) Farben mischen
blend(colors, t) Gradient-Interpolation

Analyse:

Funktion Beschreibung
luminance(color) Helligkeit (0-1)
contrast(color1, color2) Kontrast-Ratio
isLight(color) Helle Farbe?
isDark(color) Dunkle Farbe?

Generierung:

Funktion Beschreibung
randomColor() Zufällige Farbe
randomPastel() Zufällige Pastellfarbe
analogous(color, n) Analoge Farben
triadic(color) Triadische Farben
tetradic(color) Tetradische Farben

Dithering

Dithering-Algorithmen für Bildeffekte.

DitherAlgorithms:

Algorithmus Beschreibung
threshold(data, level) Einfacher Schwellwert
random(data, level) Zufälliges Dithering
floydSteinberg(data) Error-Diffusion
atkinson(data) Atkinson-Algorithmus
ordered(data, matrix) Matrix-basiert
halftone(data, angle) Halbton-Raster

DitherEffect:

Wrapper für einfache Anwendung auf ImageData.

Methode Beschreibung
apply(imageData, mode) Dithering anwenden
preview(imageData, mode) Vorschau generieren

Verwendung mit Brush

const colorset = ColorSet.getInstance(parameter);

// Farbe für Brush
const color = colorset.getColor(0);
brush.fillColor = color.color;

// Oder mit Index-Cycling
const randomColor = colorset.getRandomColor();

Best Practices

  1. ColorSet initialisieren in configure():

    ColorSet.ensureParameterSet(parameter, palettes);
  2. Events nutzen für reaktive Updates:

    ioManager.subscribe('colorset:changed', (payload) => {
      // Brush-Farben aktualisieren
    });
  3. Auto-Cycling für generative Werke:

    parameter.colorset.animation = true;
    parameter.colorset.animationInterval = 5000;