Kontextfreie Kunst

  Leonid Ryvkin   Lesezeit: 4 Minuten  🗪 1 Kommentar Auf Mastodon ansehen

In diesem Artikel geht es um das Programm Context Free Art, welches es ermöglicht, mit wenigen einfachen Befehlen Bilder zu ‚programmieren‘.

kontextfreie kunst

Installation und Benutzung

Unter Ubuntu/Debian kann man das Programm mit `sudo apt-get install contextfree` installieren. Für andere Distributionen kann man auf der Website des Projekts eine Installationsanleitung finden. Man kann auch Distrobox verwenden, um Debian/Ubuntu unter einer anderen Linux-Distribution als Container laufen zu lassen.

Für Windows gibt es eine GUI, in anderen Fällen führt man das Programm im Terminal über `cfdg inputdatei.txt outputdatei.png` aus.

Mein Set-up unter Kubuntu sieht wie folgt aus:

  • Links oben habe ich das Terminal, in dem ich `cfdg inputdatei.txt outputdatei.png` ausführe, um das Bild zu erzeugen.
  • Links unten habe ich einen Editor mit der Textdatei, aus der das Bild generiert wird.
  • Rechts öffne ich das Ausgabebild. Ich verwende dafür Okular, da es automatisch ein aktualisiertes Bild neu lädt.

(Ein Screenshot von einem Desktop. Links oben ist ein Terminal, links unten ein Text-Editor mit einer offenen Contextfree-Quelldatei und rechts das zugehörige Ausgabebild: Ein grauer Kreis rechts neben einem schwarzen Kreis)

Mit etwas Linux-Voodoo kann man bestimmt dafür sorgen, dass cfdg jedes Mal ausgeführt wird, wenn man das Bild speichert, und kann dann auf das Terminal verzichten. Andererseits kann das Erzeugen eines Bildes aus dem Code relativ lange dauern, sodass es manchmal besser ist, die Erzeugung nur manuell anstossen und stoppen zu können.

Syntax

Eine ausführliche Dokumentation der Sprache findet sich im Wiki des Projekts. Einige Elemente der Syntax haben wir bereits im Bild oben kennengelernt:

startshape FORM // beginne mit dem Muster namens 'FORM'

shape FORM { // Wenn du das Muster FORM malst
CIRCLE []  // Dann male einen Kreis
CIRCLE [x 1 brightness 0.5] // Male einen Kreis mit horizontaler Verschiebung 1 und Helligkeit 0.5
}

Struktur einer Context-Free-Datei

  • Die Datei sollte immer mit der Wahl eines Start-Musters `startshape STARTMUSTERNAME` beginnen. Dieses Muster muss danach beschrieben werden.
  • Die Beschreibung des Musters nutzt die Syntax `shape NAME { ... }`, wobei in den geschweiften Klammern eine Zeichenanleitung ist.
  • Eine Zeichenanleitung besteht aus einer Serie von Mustern (im obigen Beispiel zwei Kreise `CIRCLE`), die durch die Anweisungen in eckigen Klammern modifiziert werden.
  • Eine Modifikation besteht typischerweise aus einem Kommando (`x` oder `brightness`) gefolgt von einem oder mehreren Zahlenwerten.

Grundformen und Modifikationen

Die möglichen Grundformen sind `CIRCLE`, `SQUARE` und `TRIANGLE`. In diesem Artikel werden wir einige der folgenden Modifikationen nutzen (Fragezeichen stehen für Zahlen, die man einfügen muss):

  • `x ?` für eine horizontale Verschiebung nach rechts um `?`. Wenn man eine negative Zahl eingibt, so verschiebt man nach links. Analog dazu `y ?` für vertikale Verschiebungen.
  • `size ?` zum Skalieren um den Faktor `?`. Zum Beispiel `size 0.5`, um die Grösse einer Form zu halbieren.
  • `rotate ?` zum Drehen eines Musters um `?` Grad.
  • Für Farben nutzt das Programm den HSB-Farbraum. Das heisst man kann die Farben per `hue ?` (rotieren durch die Farben auf dem Farbkreis), `sat ?` (Saturierung/Sättigung der Farbe) und `brightness ?` (Helligkeit) kontrollieren.

Rekursion

Eine Hauptstärke von Contextfree ist, dass ein Muster auch eine (potenziell abgewandelte) Kopie von sich selbst malen kann. Diese Prozedur heisst in der Informatik Rekursion. Hier ein kleines Beispiel:

startshape MYFORM

shape MYFORM {
SQUARE [ brightness 1 sat 1] // Zeichne ein (voll saturiertes und helles) Quadrat 
MYFORM [x 1.1 rotate 20 size 0.99 hue 10] // Zeichne eine (verschobene, gedrehte, verkleinerte und im Farbton veränderte) Kopie von dir selbst
}

(Eine bunte Spirale aus kleiner werdenden Quadraten)


Wenn man Rekursion verwendet, muss man ein wenig aufpassen: Im Prinzip kann es passieren, dass das Programm unendlich weiterläuft und immer mehr Kopien vom Muster malt. Um dem entgegenzuwirken, haben wir oben die Grössenverringerung eingebaut: Wenn die Muster zu klein werden, bricht Contextfree die Arbeit ab und zeichnet sie nicht mehr.

Zufall

Im folgenden Beispiel ist auf zwei Arten Zufall eingebaut:

startshape WALD

shape WALD {
BAUM []
BAUM [x 50]
BAUM [x 100]
}

shape BAUM // Beim Malen von BAUM wird jedes Mal zufällig (gewichtet) eine der 2 'rules' ausgeführt.
rule 0.97 { 
CIRCLE []
BAUM [y 0.5 size 0.99 rotate (rand(-4,4))] 
// Hier wird BAUM um einen zufälligen Wert zwischen -4 und 4 gedreht
}

rule 0.03 {
BAUM [rotate 20]
BAUM [rotate -20]
}

(Drei verschiedene Baumsilhouetten nebeneinander)

Und vieles mehr

Contextfree hat noch viele weitere Funktionen. Nebst der Dokumentation im Wiki des Projekts, gibt es noch eine Bildergalerie mit vielen wunderschönen und interessanten Bildern.

Mathematischer Hintergrund

Als Mathematiker kann ich nicht anders, als kurz auf zwei mathematische Hintergründe des Ganzen einzugehen.

Kontextfreie Grammatiken

Das Programm heisst Context Free Art, da die Syntax, mit der wir Bilder erzeugt haben, eine kontextfreie Grammatik im Sinne der formalen Sprachen ist. Intuitiv bedeutet es, dass die Zeichenanleitungen, die wir geben, an keiner Stelle von der bereits gemalten Umgebung abhängen dürfen. Es gäbe etwa keine Möglichkeit, etwas zu formulieren, wie: 'Mal einen Kreis, wenn es noch keine Kreise in der Nähe gibt'.

Fraktale

Context Free Art ist, durch die Möglichkeit, Rekursion zu betreiben, exzellent dafür geeignet, Fraktale zu malen. Ein Fraktal ist ein Bild, dessen Ausschnitte ungefähr so aussehen wie das gesamte Bild. Grob gesagt: Wenn man sich nur ein kleines Stück der Bäume oben ansieht, kann man nie genau wissen, ob man auf dem Stamm des Baumes liegt, oder auf einem Ast, oder auf einem Teilast von einem Ast und so weiter. Im Alltag begegnen uns Fraktale häufig, zum Beispiel in der Gemüsetheke als Romanesco-Blumenkohl. In der Context-Free-Galerie gibt es viele Fraktale, dieses hier hat mir besonders gefallen, das Titelbild des Artikels ist mit dem gleichen Code damit generiert. 

Tags

Contextfree Art, Bildbearbeitung, Kunst, Mathematik, Math, Bilder

klausb
Geschrieben von klausb am 4. Juli 2026 um 16:43

Hübsch, das Titelbild erinnert mich an die Mandelbrotmenge (auch Apfelmännchen genannt). Ist wohl kein Zufall, denn die gehören ja auch zu den Fraktalen.