Generative Grafik
Diese generativen Bilder sind mit einem Algorithmus erstellt worden, der nur eine Länge von 30 Zeilen hat. In meiner Phantasie sind es Perspektiven von Landschaften im virtuellen Raum. Hell und Dunkel wird nur durch die Dichte von schwazen punkten auf weißer Fläche definiert. Auf der Basis von einer Kette an rechenintensiven Operationen entstehen so poetische generative Grafiken. Der Computer muss ein wenig leiden wenn er eine Abbildung entwickelt.
Testen Sie den Live-Prototyp hier:
https://editor.p5js.org/matthias-jaeger-net/present/v-QZJe0xU
Generierte Landschaften
Kommentierter Code:
/**
* PointGridTransformedWorld
* Autor: Matthias Jäger
* Datum: 11-04-2020
*/
/** Füllt eine Zelle mit Punkten */
function shade(x, y, s, d) {
// x: x Koordinate
// y: y Koordinate
// s: Skalierung = Breite der Rasterzelle
// d: Dichte = Anzahl der zufälligen Punkte
// Setzt den Punkt an der linken oberen Ecke an
// Versatz um halbe Breite an X- und Y-Achse.
// Raster bleibt dennoch erhalten
for (let i = 0; i < d; i++)
point(x + random(-s * 0.5, s * 0.5), y + random(-s * 0.5, s * 0.5));
}
// HELPER FUNCTIONS
/** Einzelne Zelle im Raster */
function cell(x, y, s, f) {
// x: x Koordinate
// y: y Koordinate
// s: Skalierung = Breite der Rasterzelle
// f: Zufälliger Faktor
// Zufälliger Breite – kann größer als s werden
const rs = s * 0.5 * floor(random(0, f));
// Zufälliger Dichte an Punkten
const rf = random(f * 1, f * 10);
// Eine Füllung mit Punkten für diese Zelle
shade(x, y, rs, rf);
}
//** Erzeugt einen Raster mit Zellen */
function grid(d, s, f) {
// d: Dichte = Anzahl der Spalten/Zeilen
// s: Skalierung = Breite der Rasterzelle
// f: Zufälliger Faktor
// Für alle Spalten und Zeilen wird eine Zelle erzeugt
for (let i = 0; i < d; i++)
for (let j = 0; j < d; j++)
cell(i * s, j * s, s, f);
}
// MAIN PROGRAM FUNCTION
//** setup wird automatisch von p5 aufgerufen */
function setup() {
// Beginn der Komposition
// Erzeugt einen quadratischen 3D <canvas>
createCanvas(800, 800, WEBGL);
// Grundierung mit weißer Farbe
background(255.0);
// Kompensation: Die WEBGL-Koordinaten sind zentriert
translate(-400.0, -400.0, -200.0);
// Zeichnung in die Blickebene drehen
rotateX(HALF_PI);
// Aughöhe setzen: Negative Werte wirken nach "oben"
translate(0.0, 0.0, -400.0);
// Computer mach 40 mal das selbe...
for (let i = 0; i < 40; i++) {
// Öffne eine neue Transformations-Matrix
// Somit betrifft die Verschiebung jedes einzelne Raster seperat
push();
// Geringfügige zufällige Drehung des Horizonts
rotateY(random(-0.1, 0.1));
// Verschiebe jedes einzelne Raster zufällig vertikal
translate(100.0, 0.0, random(-350.0, 150.0));
// Zufällige Dichte und Größe des Rasters, wie der Zellen
let d = floor(random(3.0, 10.0));
// Finaler Aufruf mit allen daten an das Raster
grid(d, (width / d), floor(random(i)));
// Transformation Ende
pop();
}
// Ende der Komposition
}
Mehr Projekte von Matthias Jäger finden Sie hier.