06b Processing – etwas schwierigeres Beispiel

Hier ein etwas komplexeres Beispiel. Das ist schon recht knifflig und es ist nicht schlimm, wenn man das nicht auf Anhieb versteht. Probiert es trotzdem, nur so lernt man Programmieren. Am Anfang stehen 3 Variablen, die den Effekt steuern. Spielt damit rum und probiert mal verschiedene Werte aus. Im Data Verzeichnis liegen zwei Vektorgrafiken, test1.svg und test2.svg. Probiert beide aus und macht auch mal eigene Vektorgrafiken.

Herunterladen SVG_Maus

Das Programm zeichnet die Grafik mehrmals in einem Raster. Dafür sind die beiden for-Schleifen da. Innerhalb der Schleife wird der Abstand der Maus zu jedem der Rasterpunkte berechnet. dist( x1, y1, x2, y2 ) berechnet den Abstand zweier Punkte.

Der Abstand wird dann durch die größtmögliche Entfernung (maxDist) geteilt, die im Fenster zwischen zwei Punkte vorkommen kann, nämlich die Entfernung zwischen links oben und rechts unten dist( 0, 0, width, height). Dieser Wert, der immer zwischen 0 und 1 liegt, wird von 1 abgezogen, weil wir das “Gegentil” vom Abstand, nämlich die Nähe wollen. Die Funktion “pos( naehe, 4 ) multipliziert naehe 4 mal mit sich selbst, das macht den Effekt noch stärker.

Dann wird die Zeichenposition an die Rasterposition gesetzt (translate). Abhängig vom Maus-Rasterabstand wird dann das Koordinatensystem rotiert und skaliert und der Shape gezeichnet.

int   gridSize   = 70;     // Raster-Abstand
float baseSize   = 0.01;   // Minimale Größe der SHapes
float growFactor = 0.2;    // Wachstums-Faktor für Maus-Skalierung

PShape s;
float  maxDist    = 0;

void setup() {
    size( 800, 600, P2D );
    smooth();

    s          = loadShape( "test1.svg" );    // Shape laden
    maxDist    = dist( 0, 0, width, height);  // Länge der Fenster-Diagonale
}

void draw() {
    background(16);
    noStroke();

    // Zwei verschachtelte Schleifen für x und y Richtung
    for( int x = 0; x < width; x += gridSize) {
        for( int y = 0; y < height; y += gridSize) {
            // x und y sind die Koordinaten des Rasters
            float distance   = dist( x, y, mouseX, mouseY );   // Abstand zwischen Maus und Raster Punkt
            float naehe      = 1 -  ( distance / maxDist );    // Nähe der Maus zum aktuellen Punkt von 0-1
            naehe            = pow( naehe, 4 );                // Power Funktion, macht den Effekt stärker

            pushMatrix();                // Matrix speichern
            translate( x, y);            // Koordinatensystem zur aktuellen Position verschieben
            scale( baseSize + naehe * growFactor );   // Größe abhängig von der Nähe zur Maus skalieren
            rotate( naehe * PI * 2 );    // Rotation abhängig von der Nähe zur Maus
            shape(s);                    // Shape zeichnen
            popMatrix();                 // Matrix für nächsten Durchlauf wiederherstellen
        }
    }
}

Kommentare sind geschlossen.