Prozessheft Skript

Dokumentation

Skript Erklärung

Die wichtigsten Funktionen sind in Abschnitte aufgeteilt.

1) Globale Variablen

Variabeln initialisieren

let seed = 20251110; // Abgabedatum: 10.11.2025
let titles;
let h1;
let canvas;
let seedValueEl;

2) setup() und windowResized()

setup() erstellt das Quadrat-Canvas, hängt es an #canvas-wrap und sorgt für höhere Pixeldichte. Bei Fenster-Resize wird die Grösse neu gesetzt und das Bild neu gezeichnet.

function setup() {
    const size = Math.min(window.innerWidth, window.innerHeight) - 120; // Kleinerer Wert Höhe/Breite - 120 Abstand
    const renderer = createCanvas(size, size); // Grösse vom Bild intialisieren
    renderer.parent("canvas-wrap");

    canvas = renderer.canvas;
    canvas.addEventListener("dblclick", () => {
        saveCanvas(`P-${seed}`,'png');
    });

    pixelDensity(6); // Pixel Dichte
    noLoop(); // Statisch
}

function windowResized(){
    const size = Math.min(window.innerWidth, window.innerHeight) - 120; // Gleich wie oben
    resizeCanvas(size, size); // Grösse vom Bild neu setzten
    redraw(); // neu zeichnen
}

3) draw() - Hauptzeichnung

Der Seed fixiert Zufall und Noise. Danach wird die Szene um die Mitte aufgebaut: Layer, Polygone oder Halbmonde, dann Linien als Abschluss.

function draw() {
    randomSeed(seed); // Zufall auf Seed fixieren
    noiseSeed(seed); // Perlin-Noise auf Seed fixieren
    background(0); // Hintergrund Schwarz #000

    // Grund-Säule in der Mitte
    push(); // Transform Zustände kapseln damit sich später nicht alles mitdreht
    translate(width/2, height/2); // Koordinatenursprung in die Mitte
    rotate(radians(random(-8,8))); // Leiche Gesamtdrehung -8 Grad bis 8 Grad damit es nicht zu orthogonal wird

    // Mehrere Layer mit unterschiedlichen Regeln
    const layers = 14; // 14 Layers insgesamt
    for (let i=0;i<layers;i++){
        push(); // abkapseln
        const dx = random(-width*0.18, width*0.18); // Zufällige seitliche Position
        const dy = map(i,0,layers-1, -height*0.35, height*0.35) + random(-10,10); // Zufällige vertikale Position
        translate(dx, dy); // Koordinatenursprung setzten
        rotate(radians(random(-20,20))); // Zufällige Rotation -20 Grad bis 20 Grad
        const w = random(width*0.25, width*0.55); // Zufällige Höhe
        const h = random(height*0.12, height*0.38); // Zufällige Breite

        // Farbpalette mit HSB, Hue-Saturation-Brightness + Alpha
        const hue = random(360);
        const sat = random(60,100);
        const bri = random(75,100);
        colorMode(HSB,360,100,100,100);
        const alpha = random(28,55); // transparenz

        // Abwechselnd Polygone und runde Schnitte
        if (random() < 0.5){
            // Variante A: Polygon
            fill(hue, sat, bri, alpha); // Fläche mit Farbe ausfüllen
            noStroke(); // Kein Rand
            polygon(0,0, w,h, int(random(4,7))); // Zeichnen Polygone mit 4-7 Ecken
            // Dünner weisser Rand
            stroke(0,0,100, 45); // Farbe
            strokeWeight(1); // Dicke
            noFill(); // Keine Füllung
            polygon(0,0, w*0.98, h*0.98, int(random(3,6))); // Polygone aus nur Rand mit 3-6 Ecken
        } else {
            // Variante B: Halbmond
            fill(hue, sat, bri, alpha); // Fläche mit Farbe ausfüllen
            noStroke(); // Kein Rand
            arcLike(0,0, w,h, random(TWO_PI), random(TWO_PI)); // Halbmond zeichnen
            // transparentes Rechteck darüber
            fill(0,0,100, 14); // Farbe
            rectMode(CENTER); // Zentriert
            rect(0,0, w*0.9, h*0.9); // 90% der Breite und Höhe
        }

        pop(); // Jeder Layer hat sein eigenes pop, damit der Rest nicht beeinflusst wird
    }

    // dünne Linien
    stroke(0,0,100, 70); // Farbe
    strokeWeight(1); // Dicke
    for (let i=0;i<6;i++){ // 6 Linien
        push(); // abkapseln
        rotate(radians(random(-40,40))); // drehen Zufällig -40 bis 40 Grad
        line(-width*0.45 + random(-20,20), random(-height*0.45, height*0.45), // Start Koordinaten
            width*0.45 + random(-20,20), random(-height*0.45, height*0.45)); // End Koordinaten
        pop(); // abkapseln
    }

    pop(); // abkapseln
}

4) Formen: polygon() und arcLike()

polygon() zeichnet vieleckige Formen mit leicht unregelmässigen Radien. arcLike() baut einen Halbmond aus zwei Bogenlinien.

// Hilfsfunktionen für Polygone
function polygon(cx, cy, w, h, sides){
    beginShape();
    for (let i=0; i<sides; i++){
        const a = TWO_PI * i / sides + random(-0.08,0.08);
        const rx = w/2 * (0.9 + random(-0.08,0.08));
        const ry = h/2 * (0.9 + random(-0.08,0.08));
        vertex(cx + cos(a)*rx, cy + sin(a)*ry);
    }
    endShape(CLOSE);
}

// Hilfsfunktion für Halbmond
function arcLike(cx, cy, w, h, a1, a2){
    const steps = 40;
    beginShape();
    for (let t=0; t<=steps; t++){
        const a = lerp(a1, a2, t/steps);
        vertex(cx + cos(a)*w/2, cy + sin(a)*h/2);
    }
    for (let t=steps; t>=0; t--){
        const a = lerp(a1, a2, t/steps);
        vertex(cx + cos(a)*w/2 * 0.6, cy + sin(a)*h/2 * 0.6 + 6);
    }
    endShape(CLOSE);
}