Projektdokumentation
Transcription
Projektdokumentation
Nature of Code Nature code Diana Lange HAWK Hochschule für Angewandte Wissenschaft und Kunst 2012 S E I Inhalt T E 26 26 30 Einführung Projekte Ausgangssituation Sonstiges Relevanz Text Themenfindung Weave 34 Pflanzen 41 L-System Wachstum Stengel 52 Fotos Schlaf Weltall Gestaltung Ast/Blume Fraktale Baum Glossar Quellen, Links & Bildnachweis 52½ Kugel Terrain 58 6 6 62 Impressum 66 11 70 14 74 24 76 20 48 16 14½ 44 5 Einführung Ausgangssituation Bereits der Titel »Nature of Code« verrät viel über den Inhalt des Projektes: »Nature« bedarf eigentlich keine Erklärung; es geht offensichtlich um Pflanzen, Tiere oder Ähnliches. »Code« weißt darauf hin, dass das Ganze etwas mit Programmierung zu tun hat. Darüber hinaus gibt es bereits ein gleichnamiges Projekt von Daniel Shiffman, welches eine Sammlung von Programmier-Tutorials ist. Enthalten sind die Schwerpunte Algorithmen, Trigonometrie, Fraktale und Rekursion, Physik und anderen naturnahen Themen wie dem Schwarmverhalten. Die Tutorials von Daniel Shiffman können als Ausgangspunkt zu meinem Projekt angesehen werden, da bereits so gut wie alle von mir behandelten Themen in der ein oder anderen, vereinfachten Form dabei dort angerissen worden sind. Demnach war meine persönliche Zielvorstellung für dieses Projekt, naturnahe oder naturinspirierte Objekte und/oder Grafiken zu erzeugen. INSPIRATION http://www.shiffman.net/teaching/nature/ http://www.fadstudio.us/ http://n-e-r-v-o-u-s.com/ http://www.jonathanmccabe.com/ http://theverymany.com/ http://www.biothing.org/ http://marcinignac.com/ http://justinlivi.net/ http://tomasz-starczewski.com/ http://nonstandardstudio.wordpress.com/ http://pixelero.wordpress.com/ http://anf.nu/ Ein zu Beginn des Projektes erstelltes Mindmap zur Erschließung von Themengebieten. 7 Ausgangssituation #1 #2 #3 #7 #12 #4 #5 #8 #9 »Vorbilder« oder auch Inspirationsquellen sind die Arbeiten von verschiedenen Künstlern und Designern, welche jeweils den Weg über die #6 Programmierung gehen, um die natürliche Erscheinungen nachzuempfinden. #1 Marc Fornes & THEVARYMANY: Y/Surf/Struc. 2011 #2 Francis A. Bitonti: Combustion Pavilion #11 #3 Nervous System: seed #1. 2010 #4 Francis A. Bitonti: Bristle Chair #5 Jonathan McCabe: local bilateral symmetry bone music. 2011 #10 #6 Tomasz Starczewski: Diatom. 2009 #7 Nevous System: Reaction Cup. 2011 #8 Andreas Nicolas Fischer: Untitled (G IV). 2011 #9 Marc Ignac: Space Colonization. 2011 #10 Justin Livi: justinlivi.Geode();. 2011 #11 Justin Livi: justinlivi.Dandelion();. 2011 #12 Alisa Andrasek: Orbita Series. 2006 9 Einführung Die Natur ist eine reiche Quelle für Designer. Sie steckt voller Formen und Farben, die seit Beginn der Zivilisation zu visuellen Erfindungen angeregt haben. Der größte Teil der Materialien, aus denen Dinge hergestellt werden, stammt aus der Natur, sie ist die Grundlage aller Ornament- und Schmucksysteme. Die Natur als Lehrmeisterin zeigt aber nicht nur funktionale Lösungen, sondern sie verändert darüber hinaus das Bewusstsein und die Wahrnehmung von Schönheit und Bedeutung. Relevanz Alan Powers, Natur und Design Das Projekt »Nature of Code« verfolgt keinen bestimmten Zweck, kein bestimmtes Anwendungsgebiet. Es ist vielmehr eine Art Forschungsprojekt, um sowohl die Grenzen der Programmierbarkeit von Natur als auch die eigenen Wissensgrenzen zu definieren. Aber häufig sind genau solche Experimente die Basis für darauf folgende angewandte Arbeiten. Sowohl die Formensprache, der Aufbau, die Farbgebung als auch die Arbeitsweise fliesst in so gut wie alle Design-, Architekur- und Kunstobjekte mit ein. Einige solcher Arbeiten werden auf der nächsten Doppelseite gezeigt. Das »Modell Natur« mit seinen Formen, Strukturen und konstruktiven Gesetzmässigkeiten fliesst nicht nur in die unterschiedlichsten Konzepte und Gestaltungsprozesse ein, sondern kommt auch in einer großen Bandbreite von Formgebungen und Funktionen zum Ausdruck. Nature Design S. 9 Die Natur kann für jedes Designobjekt einen »Look« und Stil liefern, aber ihr Potential geht weit darüber hinaus. Grundsätzlich bietet sie ein tiefgründiges und befriedigendes Verständnis unserer selbst und unseres Platzes in der Welt und die Fähigkeit, - durch die Designpraxis - bestimmte Fragen zu beantworten, die von Forschern, Dichtern oder ökologischen Kampagnen nicht beantwortet werden können. Alan Powers, Natur und Design S. 10 11 Relevanz #6 #3 #10 Ronan & Erwan Bouroullec: Algue, 2004, #1 Georg Dobler: Brosche, 1997, Naturabguss Phy- Modulares Stecksystem aus spritzgegossenem #7 salis, Silber oxidiert, Amethyst, 100 x40x30 mm Kunststoff, Modul 320 x 257 x 40 mm #2 Jason Munn & The Small Stakes: Konzert Plakat #11 John Ruskin: The Stones of Venice, 1851 - 53 für Mark Kozelek, 2006 #3 Deane & Woodward: Hof des Oxford-Museum, 1855 - 61 #10 #4 #1 #11 #8 #2 #4 Marin Kvamme: CD Booklet »Magnet: The Tourniquet«, 2005 #5 R. Buckminster Fuller: Expo Dome, Weltausstellung 1967 #6 Georg Dobler: Brosche, 1990, Naturabguss Äste, Silber, 93x38 x 20 mm #9 #7 Rebecca Earley: Wärmetransferdruck auf Baumwolle #8 Poul Henningsen: PH Zapfen »Artischocke«, 1958, 72 Schuppen aus nasslackiertem Edelstahl, 750 mm #9 Alice Stevenson: Sensory Perception, 2005, Zeichnung #5 13 Einführung Themenfindung Am Anfang des Projektes fand neben einer theoretischen Recherchearbeit zum Thema auch eine photographische Untersuchung statt. Das bedeutet, dass ich eine Zeit lang Pflanzen, Tiere und andere Dinge photographiert habe (siehe beiliegendes Heft). Das Ziel dabei war aus diesen Photos anschließend mögliche Projektthemen zu finden. Gegenüberstellung von Vorbild/Original und generative Umsetzung. 15 Einführung Gestaltung Im Verlauf der Projektarbeit hat sich gezeigt, dass die Ergebnisse sich optisch stark unterscheiden. Zum einen sind einige Arbeiten zweidimensional sind und andere dreidimensional. Zum anderen gibt es sowohl Grafiken mit feinen Linienstrukturen als auch eher flächige, teilweise mit leichten verläufen versehene Zeichnungen. Daher war es für mich wichtig, dem gesamten Projekt ein einheitliches Erscheinungsbild zu geben. BIODIVERSITY HERITAGE LIBRARY www.flickr.com/photos/biodivlibrary/ Vorlage für die Gestaltung sind zum einen historische, untersuchende Zeichnungen, welche zur Auflistung und Unterscheidung von Arten angefertigt wurden. Zum anderen orientiert sich die Darstellung an einem Herbarium. 17 #2 Gestaltung #1 #5 #6 #7 #4 #1 George Robert Gray: Description and Figures of some new Lepidopterous Insects, chiefly from Nepal. 1846 #2 Albrecht Dürer: Akelei. 1526 #3 E. Donovan: The Natural History of British Insects. 1792 #4 Naomi Okamoto: Sommergras ist alles, was geblieben ist vom Traum des Kriegers. #5 Peony Yip: Organic VIII. 2012 #6 Johannes Gessner: Achillae macrophylla. Bound herbarium. 1783 #7 A. Smith: Untitled. 2010 #8 Diana Lange: Zeichnung. 2012 #9 und #10 Diana Lange: Nature of Code. 2012 #11 und #12 Nature of Code in Progress. 2012 #10 #3 #12 #9 #8 19 #11 Einführung Fraktale Ein wiederkehrendes Thema in den Einzelarbeiten von »Nature of Code« sind fraktale Strukturen und Selbstähnlichkeit. Daher erfolgt in diesem Kapitel eine kurze Klärung der Begrifflichkeiten und Zusammenhänge. Eines der bekanntesten Fraktale ist die Mandelbrot-Menge, welche bereits im Jahr 1978 erstmals von Robert Brooks und Peter Matelski als Computergrafik dargestellt wurde.1 Namensgeber für dieses Fraktal war der Namensgeber Benoît B. Mandelbrot. Neben seinen Verdiensten in der fraktalen Geometrie war Mandelbrot maßgeblich an Lösungen mathematischer Probleme beteiligt und arbeitete in den Bereichen der theoretischen Physik, der Finanzmathematik und der Chaosforschung. In Bezug auf der fraktalen Geometrie leistete er den wichtigen Ansatz, die fraktale Geometrie für die Beschreibung realer Objekte anzuwenden. Mandelbrot entdeckte, dass es eine Vielzahl an natürlichen Fraktalen gibt: Ob man nun die Formen von Bergen, Küstenlinien und Flüssen betrachtet, oder die Verästelung von Pflanzen, Blutgefäßen und Lungenbläschen, oder auch die Verteilung von der Sternhaufen in Galaxien, alle diese Strukturen lassen sich durch die wichtigste Eigenschaft eines Fraktals beschreiben, die Skaleninvarianz.2 Skaleninvarianz beschreibt die Eigenschaft eines Zustands, Vorgangs, Verhältnisses oder einer Situation, bei dem bzw. der auch bei Veränderung der Betrachtungsgrößen (Skalierung) die Eigenart oder Charakteristik inklusive seiner Eckwerte weitestgehend exakt gleich bleibt, so dass ein Zustand der Universalität gegeben ist.3 Da auch die Mandelbrot-Menge zu den Fraktalen gehört, entspricht auch sie dieser Definition. In den Strukturen am Rand der Menge werden verkleinerte, ungefähre Kopien der gesamten Mandelbrot-Menge sichtbar. Damit zeigt sich auch eine gewisse Gemeinsamkeit zur Genetik. Die Randstrukturen der Mandelbrot-Menge, genannt Satelliten, können mit den Genen von Organismen verglichen werden. Beides enthält jeweils den Bauplan für den gesamten Organismus, bildet aber lokal nur das entsprechende Organ aus.4 Selbstähnlichkeit im engeren Sinne ist die Eigenschaft von Gegenständen, Körpern, Mengen oder geometrischen Objekten, in größeren Maßstäben, d. h. bei Vergrößerung dieselben oder ähnliche Strukturen aufzuweisen wie im Anfangszustand.5 Fraktale sind demnach sowohl natürliche als auch künstliche Gebilde, welche als Muster ausgebildet sein können, die einen hohen Grad von Skaleninvarianz und Selbstähnlichkeit enthalten. Sie können durch verschiedene Verfahren erzeugt werden: durch die Iteration von Funktionen, durch Dynamische Systeme oder den L-Systemen.6 1 vgl. R. Brooks, J. P. Matelski: dynamics of 2-generator subgroups of PSL(2,C) 2 vgl. wikipedia.de: Benoît Mandelbrot 3 wikipedia.de: Skaleninvarianz 4 vgl. wikipedia.de: Selbstähnlichkeit 5 wikipedia.de: Skaleninvarianz 6 vgl. wikipedia.de: Fraktal 21 Fraktale Selbstähnlichkeit und natürliche F´raktale #1 Diana Lange: Baumstamm #2 Wurzel der Sonnenblume (Helianthus spec.) #3 Hermann Schachner: Scapania undulata Blattzellen #4 Diana Lange: Blattdetail #5 Diana Lange: Blatt #6 Diana Lange: Baum #3 #1 #4 #5 #6 #2 Fraktale #7 Mandelbrotgrafik #8 Romanesco Blumenkohl #9 computergenerierte Fraktalgrafik #10 NASA: The Antennae Galaxies in Collision, Hubble images #11 NASA: Omega Nebula, Hubble images #7 #8 #9 #10 #11 23 Einführung Glossar Dynamische Arrays Dynamische Arrays übernehmen die selbe Aufgabe wie einfache Arrays. Der einzige Unterschied ist, dass beim Erstellen die Größe des Arrays nicht festliegen muss. Das bedeutet, dass innerhalb des Programmes Daten dynamisch hinzugefügt oder wieder ent- Variablen & Datentypen Schleifen Funktionen und Methoden fernt werden können. Der Nachteil gegenüber den Arrays ist, dass Variablen werden dazu benutzt um Daten festzuhalten. In Pro- Als Schleife wird das wiederholte Ausführen von Anweisungen Funktionen sind dazu da innerhalb des Programmes Teilprobleme die »Liste« mehr Speicherplatz verbraucht, da jedes Mal, wenn cessing und den meisten anderen Programmiersprachen gibt bezeichnet. Auf diese Weise können die Anweisungen definiert, zu lösen oder Daten zu verarbeiten. Man kann zwischen verschie- ein Objekt hinzugefügt wird neuer Speicherplatz allokiert wer- es folgende Datentypen: int (Integer) für Ganzzahlen, float für modifiziert oder einfach nur ein vielfaches durchgeführt werden dene Typen von Funktionen unterscheiden. Es gibt zum Beispiel den muss.15 Gleitkommazahlen, boolean für wahr / falsch, char für ein einzel- bevor eine Abbruchsbedingung eintrifft. In Processing gibt es drei Funktion mit und ohne Rückgabewert und mit oder ohne über- nes Zeichen (z. B. ein Buchstabe) und color für Farben. Bei allen Möglichkeiten für Schleifen: while, do... while und for. Der Syn- gebene Paramter.13 Ein einfaches Beispiel zur Berechnung einer diesen Datentypen spricht man von »Primitives«, also einfachen tax der for-Schleife lautet: Summe könnte so aussehen: Assoziative Arrays Datentypen. Darüber hinaus gibt es noch »Composites«, zusam- for (Anfangsbedingung, Abbruchbedingung, Veränderung der int summe (int a, int b) { return (a+b); } Die Art von Arrays, in Processing genannt HashMap, ist ebenfalls mengesetze Datentypen. Dazu gehören Strings für Zeichenket- Anfangsbedingung)10 »int« (Ganzzahl) ist der Rückgabewert, dass heißt das an der dynamisch. Die einzelnen Instanzen können aber nicht nur über ten (z. B. Wörter), Arrays, ArrayLists und Objects. Unabhängig Stellen des Programmes, an dem die Funktion aufgerufen wird, einen Indexwert abgefragt werden, sondern beispielsweise auch vom Datentyp erfolgt die Deklaration und Wertzuweisung immer die Summe aus den beiden übergebenen Paramtern »a« und »b« über ein Suchwort.16 7 8 gleich: Typ name = Wert; berechnet wird. »summe« ist der Funktionsname, durch welchen Beispiel mit »iNum« als Variablenname: int iNum = 12; Klassen und Objekte Jeder Datentyp »verbraucht« eine bestimmte Menge an Speicher. Klassen sind Sammlungen von Attributen und Methoden. Um beispielsweise ein Integer zu speichern werden 32 bits benö- dienen dazu, den Code in komplexen Programmen zu organi- tigt, bei einem String schon doppelt so viel. Gerade für aufwen- sieren und zu strukturieren. Oder anders gesagt, jede Klasse ist dige Programmierungen und Programme, die in Echtzeit laufen dafür da, ein Problem zu lösen oder eine bestimmte Aufgabe zu Arrays 10 vgl. ebd., XIX S. 8ff sollen, muss der Speicherverbrauch bewusst eingesetzt werden erfüllen. Instanzen von Klassen werden als Objekte bezeichnet. 12 Eine Array ist eine Art Liste, in welcher mehrere Instanzen vom 11 vgl. www.willemer.de/informatik/java/javaclas.htm und möglichst immer auf den kleinsten Datenspeicher zurück ge- Ein beliebtes Veranschaungsbeispiel für die Erklärung von Klas- gleichen Datentyp zwischengespeichert werden kann. Im Gegen- 12 vgl. K. Terzidis: Algorithms for Visual Design, XIX S. 63f griffen werden. sen ist der Mensch. Sabine bespielsweise ist eine Instanz der satz zu den Dynamischen Arrays, muss beim Erstellen bereits die 13 vgl. Wolf: C++ von A bis Z, S.94ff In den meisten Fällen ist es auch möglich einen Datentyp in einen Klasse Mensch. Sie ist blond, hat grüne Augen und ist 1.78 m Größe des Arrays festliegen, d.h. wie viele Einträge in die Liste 14 vgl. K. Terzidis: Algorithms for Visual Design, XIX S. 28f anderen umzuwandeln. Dabei wird von Typecasting oder einfach groß. Marco hingegen hat schwarze Haare, braune Augen und gespeichert werden sollen. Bei Arrays sind die einzelnen Instan- 15 vgl. D. Shiffman: Learning Processing, S.428f nur Casting gesprochen.9 Ein Beispiel: ist 1,82 m groß. Beide gehören sie der Klasse Mensch an, denn zen bzw. Listeneinträge jeweils über einen Indexwert erreichbar, 16 vgl. processing.org float f = 3.6; sie haben die gleichen Attribute: Haarfarbe, Augenfarbe, Größe. d.h. die Reihenfolge der Einträge spielt eine wichtige Rolle. int i = (int) f; Werden Klassen verwendet, so wird dies als objektorientierte »i« nimmt dabei den Wert »3« an (die Dezimalstellen werden Programmierung, oder kurz OOP, bezeichnet. einfach weggelassen). die Funktion wie im folgenden Beispiel aufgerufen werden kann: 11 Sie int x = summe (2, 4); 7 vgl. K. Terzidis: Algorithms for Visual Design, XIX S. 2f 8 vgl. www.processing.org/reference/ 9 vgl. K. Terzidis: Algorithms for Visual Design, XIX S. 3f 14 25 Projekte BILD http://www.flickr.com/photos/dianalange/sets/72157629206992270/ VIDEO http://vimeo.com/dianalange CODE http://openprocessing.org/user/5969 Sonstiges Exkurs: Die Projektseite Im Verlauf der Arbeit entstanden neben den eigentlichen Projekten eine Reihe von kleineren Übungen und Nebenprodukten. Einige davon werden auf der nächsten Doppelseite gezeigt. #1 Projekttitel #2 Projektassoziation / Natürliches bzw. naturalistisches Vorbild #3 Einführungstext #4 Definitionen #5 Quellen #6 Links zum Projekt #7 Themenbezogenes Zitat #8 Weitere Informationen #9 Programmierung: Klassen und ihre wichtigsten Aufgaben und Funktionen #10 Sonstiges #7 #2 #8 #1 #9 #3 #6 #5 #4 #10 27 #1 Sonstiges #2 #3 Pusteblumenzeichnung: Strahlen gehen im dreidimensionalen Raum von einem Punkt aus; am Ende jedes Strahls befindet sich ein Schirmchen. #4 Sortierzeichnung: Eine bestimmte Anzahl an Punkten wird auf einer Fläche mit zufälliger Position verteilt. Diese Punkte werden anschließenden so sortiert, dass sie mit einer sich nicht kreuzenden Linie verbunden werden kann. #3 #1 Zeitbasiertes Zeichnen: Zwei Punkte bewegen sich auf einer Kreisbahn. Diese zwei Punkte werden mit einer Linie verbunden, welche sich von Weiß zu Schwarz und wieder zurück verändert. Nach einem zufällig gewählten Zeitraum ändert sich die Position und der Durchmesser der Kreisbahn. #2 Sinuszeichnung: Experiment mit den Winkelfunktionen im dreidimensionalen Raum. #4 29 Projekte Exkurs: Kreispunkte berechnen Text »Text« ist ein Übungsprojekt, was nicht viel mit dem ursprünglichen Thema, »Natur« als Vorbild zu tun hat, außer dass die elementare Funktionsweise auf Rekursion basiert. Mir ging es dabei in erster Linie darum, meine Programmiertechnik zu verbessern, den Programmcode besser oder sinnvoller zu strukurieren und neue Techniken, wie das Arbeiten mit Assoziativen Arrays zu erlernen. Divide & Conquer Divide & Conquer bzw. »Teile und Herrsche« ist ein Such- bzw. Problemlösungsansatz aus dem Bereich der Informatik.17 Das gestellte Problem wird in kleinere und demnach einfacher zu lösende Teilprobleme untergliedert. Über ein rekursives Verfahren werden so Teillösungen gefunden, welche wiederum die Lösung des Gesamtproblemes bilden. Ein häufiger Anwendungsbereich ist die Suche in sortierten Listen: »Hierzu wird das Element in der Mitte der Liste mit dem gesuchten Eintrag verglichen. Anschließend muss nur noch in dem vorhergehenden oder nachfolgenden Teil weiter gesucht werden. Dazu kann dieser erneut auf diese Art float centerX = width/2; float centerY = height/2; int d = 400; for (int i = 0; i < 360; i++) { float x = centerX + cos (radians (i)) * d; float y = centerY + sin (radians (i)) * d; point (x, y); } X-Position der Kreismitte Y-Position der Kreismitte Kreisdurchmesser Schleife 360x durchführen X-Position berechnen Y-Position berechnen Punkt an Stelle »X,Y« Zeichnen DATENVISUALISIERUNG www.visualcomplexity.com VISUALIZER delegiert und erzeugt alle visuellen Effekte. Das reicht von der Textvisualisierung / Grafik bis hin zur Erstellung des Fensterglaseffektes, welcher in den Instanzen der Klasse »TextDisplayer« als Hintergrundbild verwendet wird. TEXTANALYZER lädt eine Text-Datei (.txt) in den Processing-Sketch, analysiert diesen und legt mithilfe eines »Divide & Conquer« Verfahrens eine alphabetisch sortierte Liste vom Typ »Word« an. TEXTDISPLAYER ist für die Anzeige des Textes verantwortlich. Die Klasse erzeugt die notwendigen Zeilenumbrüche und eine interaktive Scrollbar, falls der Text nicht in das Ausgabefenster passen sollte. WORD speichert das Wort selbst ab, wie häufig es im Text vorhanden ist und die Position(en), an der das jeweilige Wort gefunden wurde. und Weise halbiert werden. Diese Suchmethode, heutzutage bekannt als Binäre Suche, geht bereits auf die Babylonier zurück.«18 17 vgl. Vazirani, Umesh V.: Algorithms, S. 1 18 wikipedia.de: Teile und herrsche (Informatik) BILD http://www.flickr.com/photos/dianalange/sets/72157627657832455/ VIDEO http://vimeo.com/31203226 CODE http://www.openprocessing.org/sketch/44133 31 Text Innerer Kreis: Der gesamte Text wird in seiner original Reihenfolge am Kreis angeordnet. Dazu wird der Text aus einer externen Datei geladen und in einzelne Wörter untergliedert, welche in einem Array zwischengespeichert werden. Äußerer Kreis: Mit Hilfe eines »Divide & Conquer« Suchalgorithmus wird eine alphabetisch sortierte Liste aller unterschiedlichen Wörter angelegt. Das heißt, für jedes neue Wort wird ein Listeneintrag erstellt; gleichzeitig wird abgespeichert, wie häufig jedes Wort gefunden wurde. Diese sortierte Wortliste wird am äußeren Kreis angeordnet. Äußerer Kreis: Je öfter ein Wort im Text gefunden wurde, desto größer ist die Schriftgröße. Linien: Es wird eine Linie gezeichnet, wenn das Wort auf dem äußeren Kreis mit dem auf dem inneren Kreis übereinstimmt. Dazu werden die zwei Arrays (Originaltext + alphabetisch sortierte Liste) miteinander verglichen. Um eine kurvige Linie zu erhalten werden jeweils zwei Kontrollpunkte berechnet, welche sich zwischen dem äußeren und dem inneren Kreis befinden. Interaktive Elemente: Die Arbeit ist sowohl als Grafik als auch als App gedacht. Um letzteren gerecht zu werden, sind ein paar kleine Interaktionen möglich: Wenn ein User sich mit der Computermaus einem Wort auf dem äußeren Kreis nähert, werden die Linien zwischen äußeren und inneren Kreis rot eingefärbt. Auf diese Weise kann überprüft werden, an welchen Stellen das jeweilige Wort im Originaltext vorkommt. Des weiteren werden beim drücken der Leertaste zwei Fenster über die Grafik gelegt, in welchen der Originaltext als Lauftext und die alphabetisch sortierte Liste gezeigt wird. Fertige Grafik: Die Wörter auf dem äußeren Kreis werden durch Kreise ersetzt. Je größer der Kreis ist, desto häufiger wurde das Wort, wofür der Kreis steht, gefunden. Wenn ein Wort mehr als einmal im Text vorkam, kann der Kreis eine rote Umrandung erhalten. Dafür muss eine weitere Bedingung erfüllt werden: Die Linienstärke der Umrandung wird umso dicker, je länger das Wort ist. Die so berechnete Linienstärke darf aber nicht größer sein, als der Radius des jeweiligen Kreises. 33 Projekte Weave FLICKR API www.flickr.com/services/api/ PROXML www.creativecomputing.cc/p5libs/proxml/ HYPERBOLIC CORAL www.openprocessing.org/sketch/9406 19 vgl. lexikon.martinvogel.de: API 20 vgl. www.sumo.de: Definition: API 21 vgl www.creativecomputing.cc/p5libs/proxml/ 22 vgl. J. Wolf: C++ von A bis Z S. 657 API API ist die Kurzform von »Applied program interface« und bedeuted übersetzt »Schnittstelle für Anwendungsprogramme«.19 APIs ermöglichen den Zugriff auf Daten um diese beispielsweise für Anwendungen zu nutzen.20 Dieses Projekt entstand durch eine Kooperation mit der Zeitschrift »Weave«. Dabei ist die Covergestaltung für die Ausgabe 1.12 (Februar/März 2012) entstanden. proXML proXML ist eine Erweiterung für Processing, welche das Lesen und Schreiben von XML-Dateien erlaubt.21 Dadruch können externen Daten über eine API in Processing eingebunden und wei- SKETCH EINS IMAGEFROMAPI lädt Bilddateien über die flickr API in Processing und veranlasst, dass diese analysiert werden und das Resultat als Textdatei abgespeichert wird. IMAGEANALYZER anlysiert das Bild nach seinen Farben und Farbanteilen. COLORSAVER enthält den Farbwert, wie häufig und wo im Bild die Farbe gefunden worden ist. SKETCH ZWEI LOADIMAGEDATA lädt die im ersten Sketch erstellten Textdateien, welche die Farbinformationen enthalten, und speichert diese Daten in ein Array vom Datentyp »Color«. COLOR enthält die Farbdaten, welche in »LoadImageData« geladen worden sind. VISUALISER ist für die grafische Ausgabe der Daten verantwortlich. ter verarbeitet werden. Exceptions In der Programmierung ist es durch das Exception-Handling möglich unerwartete Fehler aufzufangen, ohne das gleich das gesamte Programm abstürzt.22 Dies ist hilfreich, wenn mit schwer kalkulierbaren Daten gearbeitet werden muss. Gerade das Arbeiten mit den Daten von einer API bietet viele mögliche Fehlerquellen: Die Daten können nicht gefunde werden, nicht geladen werden, das Dateiformat kann fehlerhaft sein usw. BILD http://www.flickr.com/photos/dianalange/sets/72157629503336271/ 35 Weave Die erste (umgesetze) Idee für das Cover der Weave war es, abstrakte Grafiken aus Bildern zum Thema »Karneval« zu generieren. Dazu werden Bilddaten mit Hilfe der Library »proXML« von flickr geladen. Die Bildsuche erfolgt nach Suchbegriffen, in diesem Fall passend zum Thema Karneval (»Jecken«, »Fasching«, usw.). Die gefundenen Fotos werden anschließend farblich analysiert, d.h. es wird geschaut welche Farben im Bild vorkommen und wie oft. Diese Daten werden dann in verschiedenen Formen visualisiert. Je nach Experiment werden Kreise und/oder geschwungene Linien mit viel Zufall kombiniert. Gemeinsamer Nenner dabei bleibt, dass jedes grafische Element jeweils für eine gefundene Farbe steht und je größer bzw. län- ger es ist und je dicker die Linienstärke ist, desto häufiger wurde diese Farbe gefunden. 37 Weave Links: Die Farbgrafiken werden in Cinema 4D als Textur für dreidimensionale Objekte weiterverwendet. Unten: Die in Processing erstellten »Korallen« (Original von Kerrin Jefferis und Patrick Stein) werden verformt und zu einem Kopfschmuck collagiert. Zum besseren Vergleich werden bereits veröffentlichte Covergestaltungen betrachtet: Was war gut, was nicht? Oben: Auch die in Cinema 4D modellierte Maske wird mit einer zuvor erstellten Farbgrafik belegt. Rechts: Verschiedene Varianten werden ausgetestet (Tiefenschärfe, Farbe, Stereoskopie, usw.). Links: In Abhängigkeit vom Coverlayout wird der optimale Bildausschnitt gesucht. Hier werden die erstellten Grafiken mit dem Coverlayout der Weave gezeigt. Es stellt sich heraus, dass die »Strichzeichnungen« für ein Cover zu »unspektakulär« sind und außerdem nicht gut mit dem Layout harmonieren. Daher wird sich dem Thema »Karneval« im nächsten Schritt plakativer genähert, in Form einer Venezianischen Maske. 39 Projekte Unsere ganze Geschichte ist bloß Geschichte des wachenden Menschen; an die Geschichte des schlafenden hat noch niemand gedacht. Georg Christoph Lichtenberg, zitate-aphorismen.de Schlaf BILD http://www.flickr.com/photos/dianalange/sets/72157629571704035/ DATALOADER lädt die Daten in das Programm und bereitet diese für den weiteren Verlauf auf. Dabei wird überprüft, ob bei allen Schlafkurven die gleiche Anzahl an Daten vorhanden ist (Vollständigkeit der Daten) und wandelt die als String geladenen Daten in Zahlenwerte um. SLEEPCURVE enthält die in »DataLoader« geladenen Werte als Array, SLEEPSPHERE erstellt das Mesh basierend auf den Schlafdaten. Punkten ein Polygonnetz erzeugt. Daher muss entweder mit einer externen Libraries gearbeitet werden oder man baut sich die ein- P1 P4 P2 P3 ... P1 P3 P5 P7 P9 P11 P13 P2 P4 P6 P8 P10 P12 P14 ... endShape(); ne mitgelieferte Funktion, welche aus einer Menge an gegebenen ... beginShape(TRIANGLE_STRIP); oder eines dreidimensionalen Körpers.23 In Processing gibt es kei- beginShape(); P1, P2, P3, P4 endShape(CLOSE); den Polygonen. Diese dienen der Beschreibung einer Oberfläche beginShape(); P1, P2, P3, P4 endShape(CLOSE); ter«. Ein »Mesh« besteht aus einer Menge kleinerer Elemente, beginShape(); P1, P2, P3, P4 endShape(CLOSE); tergrafik verwendet und heißt übersetzt nichts anderes als »Git- beginShape(); P1, P2, P3, P4 endShape(CLOSE); Dieser aus der Geometrie stammende Begriff wird in der Compu- beginShape(); P1, P2, P3, P4 endShape(CLOSE); Mesh beginShape(); P1, P2, P3, P4 endShape(CLOSE); »Schlaf« ist eine Arbeit zum Thema Datenvisualisierung. Die Idee ist, ein personalisiertes Objekt zu schaffen, welches die Daten des eigenen Schlafrythmuses zeigt. Dieses Objekt könnte dann beispielsweise als Schmuck getragen werden. PAUL BOURKE: SURFACE (POLYGONAL) SIMPLIFICATION www.paulbourke.net/geometry/polygonmesh/index.html PAUL BOURKE: SPHERE GENERATION www.paulbourke.net/miscellaneous/sphere_cylinder/ zelnen Polygone selber. 23 vgl. wikipedia.de: Gittererzeugung Hier werden zwei Varianten der manuellen Polygonnetzerzeugung in Processing gegenüber gestellt. Links werden jeweils vier Punkte (P1, P2, P3, P4) miteinander verbunden; danach wird die Form geschlossen. Der Nachteil bei diesem Vorgehen ist, dass auf diese Weise die Funktionen »beginShape()« (Polygon beginnen) und »endShape()« (Polygon schließen) sehr häufig aufgerufen werden, sehr viele, einzelne Polygone erzeugt werden und damit der Speicherbedarf und der Rechenaufwandt sehr groß sind. Um einiges eleganter ist die Lösung mit dem zusätzlichen Parameter »TRIANGLE_STRIP«, wodurch mit nur einem mal Aufrufen von »beginShape()« ein Band aus einer Vielzahl von Vertexpunkten erstellt werden kann. 41 Schlaf Oben links: Die Grundform basiert auf einer Kugel. Oben mitte: Auf die kugelige Grundform werde die Schlafdaten gelegt. Jedes Band enthält die Daten einer Nacht. Später werden noch Zwischenstufen berechnet um so eine lückenlose Form zu erhalten. Oben rechts: Gezeigt werden die Beispieldaten einer Woche Schlaf. Jeder der Streifen steht für eine nächtliche Schlafperiode. Diese Daten werden als Textdatei abgespeichert und in das Programm geladen. Links: Zu sehen ist eine Reihe von Zustandsrenderings die während des Arbeitsprozesses entstanden. Die verschiedenen Experimente führten letztenendlich zu einer reduzierten Farbgebung und einer Veränderung der Form von einer »stacheligen Kugel« zur fertigen »Schlafblume«. Diese Seite: Oben zu sehen ist eine in Processing gerenderte Schlafblume. Das 3D-Modell wird als »DXF« Datei exportiert und kann damit in allen gängigen 3D-Programmen weiter verarbeitet werden. Auf diese Weise entstand das untere Bild: In Cinema 4D kann die »DXF« Datei geladen und das enthaltene Objekt mit realistischen Materialien belegt werden. 43 Projekte Der Baum, der den einen zu Glückstränen rührt, ist in den Augen des anderen nur ein grünes Ding, das im Weg steht. Manche betrachten die Natur als lächerlich und deformiert [...] und einige sehen die Natur überhaupt nicht. Doch in der Augen des Menschen mit Fantasie, ist die Natur Fantasie selbst. William Blake in Natur und Design S. 17 Ast/Blume BILD http://www.flickr.com/photos/dianalange/sets/72157628815886507/ CODE http://www.openprocessing.org/sketch/49159 Manchmal fängt man mit einem Projekt an und hat genau im Kopf, was dabei heraus kommen soll. Auf dem Weg dorthin kann es jedoch durch eine Vielzahl von Zufällen vorkommen, dass etwas ganz anderes, womöglich besseres dabei entsteht. In diesem Fall wollte ich eine Art Pusteblume programmieren. Aber spätestens nach dem Einbauen einer rekursiven Funktion ergab sich etwas Neues: Ein Gebilde aus feinen, astähnlichen Strukturen, welche kreisförmig angeordnet immer noch an die ursprüngliche Intension der Blume erinnern. Rekursion In der Programmierung gibt es zwei Möglichkeiten bestimmte Augaben zu lösen. DIe erste Variante ist das iterative, lineare Programmieren. Hierbei wird das Progamm nacheinander, in einer klaren Reihenfolge ausgeführt. Rekusive Funktionen hingegen rufen sich selber wieder auf. Generell können die meisten Probleme sowohl iterativ als auch rekursiv gelöst werden. Der Vorteil beim rekusiven Programmieren liegt darin, dass der Programmiercode häufig um einiges kürzer ist als die iterative Lösung umd damit für den Programmierer einfacher zu lesen ist. Natürlich hat diese Arbeitsweise auch einige Nachteile. So muss zum Beispiel bei jedem Aufruf der Funktion erneut Speicher für die lokalen Variablen allokiert werden, was dazu führen kann, dass der zur Verfügung stehende Arbeitsspeicher relativ schnell ausgelastet wird. Dies wiederum kann zum Abstürzen des Programmes führen.24 24 vgl. Fleischer, Kevin: Rekursion und Iteration S. 2 ff FLOWER erstellt ein Array vom Datentyp »BranchCreator«. Außerdem enthält »Flower« die Daten, wie viele Äste gezeichnet werden sollen, wo die Grafik positioniert ist und welchen Durchmesser sie haben soll. BRANCHCREATOR erstellt mit Hilfe einer rekursives Funktion die einzelnen Astabschnitte. Diese werden als Instanten vom Datentyp »BranchDrawer« in einer ArrayList gespeichert. BRANCHDRAWER enhält die Koordinaten des jeweiligen Astes und berechnet eine Kurvenform aufgrund des Anfangs- und Endkoordinaten. Darüber hinaus ist »BranchDrawer« für das Zeichnen des Astes verantwortlich. 45 Ast/Blume #5 #1 #7 #2 #6 Hier wird gezeigt, wie die Veränderung bestimmter Parameter das Aussehen von »Ast/Blume« beeinflussen. #1 und #2 In »Flower« wird die maximale Länge der einzelnen Äste über eine Noisefunktion (def. »noise« siehe Projekt »Kugel«) bestimmt. Die Winkel werden per Zufallsfunktion festgelegt. #3 und #4 Bei gleichbleibendem Winkel wird der Grad der Längenänderung der »Kindäste« (jüngere Astsegmente, die von einem älteren Astsegment abzweigen) variiert. Nummer 3 ergibt sich bei geringer Längenänderung (z.B. mind. 80% der Länge des »Mutterastes), Nummer 4 bei hoher Längenänderung. #5 bis #8 Bei diesen Beispielen bleibt der Längenänderungsfaktor konstant und die Winkel vergrößern sich schrittweise. #9 und #10 Bei allen erzeugten Ästen ist die maximale gleich, wodurch sich eine kreisartige Außenform ergibt. #8 #3 #10 47 #9 #4 Projekte Wir können [...] nach funktionalen Erklärungen für die Dinge suchen, die uns in der Natur gefallen, etwa die Farbgebung eines Vogelkleides oder die Form eines Blattes. Es ist tröstlich, dass die Dinge eventuell nicht zufällig so sind, auch wenn wir sie nicht ganz verstehen. Baum Alan Powers, Natur und Design S. 9 BILD http://www.flickr.com/photos/dianalange/sets/72157628903145341/ CODE http://www.openprocessing.org/sketch/49159 »Baum« ist genau genommen kein eigenständiges Projekt, sondern einer Weitentwicklung von »Ast/Blume«. Da bei dem vorangegangenem Projekt eine astartige Struktur entstand, war es nur logisch, daraus naturalistische Bäume zu formen. Hierfür mussten Programmiercode und einige Parameter nur minimal verändert werden. TREE erstellt ein Array vom Datentyp »BranchCreator«. Außerdem enthält »Tree« die Daten, wie viele Äste gezeichnet werden sollen, wo die Grafik positioniert ist und welchen Durchmesser sie haben soll. BRANCHCREATOR erstellt mit Hilfe einer rekursives Funktion die einzelnen Astabschnitte. Diese werden als Instanten vom Datentyp »BranchDrawer« in einer ArrayList gespeichert. BRANCHDRAWER enhält die Koordinaten des jeweiligen Astes und berechnet eine Kurvenform aufgrund des Anfangs- und Endkoordinaten. Darüber hinaus ist »BranchDrawer« für das Zeichnen des Astes verantwortlich. BLATT bzw. BLUEHTE zeichnet ein Blatt bzw. eine Blühte an einer bestimmten Position. Exkurs: Punkte auf einer Kugel berechnen float centerX = width/2; float centerY = height/2; float centerZ = 0; int d = 400; for (int i = 0; i < 360; i++) { for (int j= 0; j < 360; j++) { float x = centerX + sin (radians (i)) * cos (radians (j)) * d; float y = centerY + sin (radians (i)) * sin (radians (j)) * d; float z = centerZ + cos (radians (i)) *d; point (x, y, z); } } X-Position der Kugelmitte Y-Position der Kugelmitte Z-Position der Kugelmitte Kugeldurchmesser erste Schleife 360x durchführen zweite Schleife 360x durchführen X-Position berechnen Y-Position berechnen Z-Position berechnen Punkt an Stelle »X,Y,Z« Zeichnen 49 Baum Links: Hier werden die einzelnen Schritte gezeigt, wie sich aus der kreisförmigen »Blume«, über eine buschartige Form schließlich der »Baum« entwickelt hat. Oben: Im Vergleich zur »Blume« verschachteln sich die einzelnen Äste mehr in kleinere Unteräste. Zusätzlich nimmt die Strichstärke zu den Spitzen hin ab, was mehr dem Aussehen eines natürlichen Baumwachstums entspricht. Unten: Um ein noch naturalistischeres Bild zu schaffen, werden unterschiedlich große und eingefärbte Blätter und Blühten hinzugefügt. 51 Projekte [In den Werken des Baron Cuvier sieht man], wie die Natur in ihrem Fortschreiten trotz ihrer Abwechslung und ihres unermesslichen Reichtums doch in ihren Fundamentalformen und Motiven äusserst sparsam und ökonomisch bleibt. Dasselbe Skelett wiederholt sich fortwährend, jedoch mit unzähligen Änderungen, welche wieder teils durch die allmähliche Entwicklung der Individuen, teils durch die Existensbedingungen, welche sie zu erfüllen hatten, modifiziert werden. Pflanzen Gottfried Semper, Entwurf eines Systems der vergleichenden Stillehre Durch diverse Internetseiten, welche sich mit der Programmierung von pflanzlichen Strukturen befassen, wurde ich auf die sogenannten »L-Systeme« aufmerksam. Das interessante an diesen Systemen ist es, dass sehr unterschiedlich aussehende Pflanzen damit generiert werden können. Kernstück jeder Pflanze ist ein Regelwerk (Axiom und Ersetzungsregel, siehe beistehende Definition). Jede kleinste Änderung an der Ersetzungsregel bewirkt eine wahrnehmbare Veränderung in der Pflanzengestalt. Daher gibt es in diesem Projekt zum einen Varianten bereits bekannter L-Systeme, welche z.B. auf der Internetseite von Paul Bourke veröffentlicht sind, aber auch komplett neu entwickelte Systeme, welche durch Experimente entstanden. Diese haben nicht den Anspruch, eine real existierende Pflanze nachzuempfinden. Vielmehr sollen sie so aussehen, als ob die Pflanze so existieren könnte. Lindenmayer-System L-Systeme sind grammatische Modelle zur Erstellung realisitischer Pflanzenstrukturen. Benannt wurden das 1968 entwickelte System nach dem Botaniker Aristid Lindenmayer. Er transformierte den regelbehafteten Aufbau von Pflanzen in ein Ersetzungssystem. In einem einfachen Beispiel wird die Funktionsweise deutlicher: Am Anfang ist das Zeichen »F« (Axiom) gegeben, welches durch die Zeichenfolge »F+F« ersetzt werden soll. Nach einer Ersetzung erhält man nun »F+F«, nach der zweiten »F+F+F+F«. Die auf diese Weise entstandene Zeichenkette wird dann als Grafik interpretiert, wobei jedem Zeichen eine explizite Bedeutung zugeordnet ist (siehe Tabelle auf gegebüberliegender Seite).25 F f + | [ ] # ! @ { } < < & ( ) Vorwärtsbewegung um eine Linienlänge & Zeichnen der Linie Vorwärtsbewegung um eine Linienlänge ohne Zeichnen der Linie Drehung nach Links um gegebenen Winkel Drehung nach Rechts um gegebenen Winkel Drehung um 180° Speichern des aktuellen Zustandes (Winkel, usw.) Zurückkehren zum vorher gespeicherten Zustand Erweiterung der Linienlänge um bestimmten Wert Verminderung der Linienlänge um bestimmten Wert Punkt zeichnen Ein Polygon beginnnen Ein Polygon schließen Die Linienlänge mit einem Wert multiplizieren Die Linienlänge durch einen Wert dividieren Die Bedeutung von + und - tauschen Erweiterung des gegebenen Winkels um einen bestimmten Wert Verminderung des gegebenen Winkels um einen bestimmten Wert BIOLOGIE & INFORMATIK www.algorithmicbotany.org RULE enthält die Ersetzungsregel des L-Systems als zwei Stringvariablen: das zu suchende Zeichen und den Inhalt, mit welchem dieses ersetzt werden soll. RULELIBRARY enthält das Axiom und ein Array mit allen Ersetzungsregeln vm Datentyp »Rule« LSYSTEM generiert mithilfe einer übergebenen »RuleLibrary« und einer festgelegten Iterationsanzahl eine Kette von Zeichen vom Datentyp String. Diese Zeichenkette repräsentiert die jeweilige Pflanze. Dabei erfolgt die Erzeugung des Strings nach den gegebenen Ersetzungsregeln von »RuleLibrary«. TREE interpretiert die in »LSystem« erstellte Zeichenkette mit grafischen Elementen (siehe Tabelle). BRANCH zeichnet einen Ast mit gegebenen Anfangs- und Endkoordinaten und festgelegtem Aussehen. BLATT bzw. BLUEHTE zeichnet ein Blatt bzw. eine Blühte an einer bestimmten Position. 25 vgl. F. Breier: L-Systeme und andere künstliche Pflanzen S 4ff. 26 vgl. P. Bourke: L-System User Notes BILD http://www.flickr.com/photos/dianalange/sets/72157629206948652/ MEHR BILD http://www.flickr.com/photos/dianalange/sets/72157628985797345/ CODE http://www.openprocessing.org/sketch/49814 Im Lindenmayer-System repräsentiert jedes Zeichen eine bestimmte grafische Komponente. In dieser Tabelle finden sich alle vereinheitlichten Zeichen und ihre Bedeutung.26 Natürlich ist es problemlos möglich, weitere Zeichen und Bedeutungen hinzuzufügen. Beispielsweise wurde das System bei meinen Pflanzen noch um die Zeichen »B« für Blühte zeichnen und »G« für Blatt zeichnen erweitert. 53 Pflanzen Wolken sind keine Kugeln, Berge keine Kegel, Küstenlinien keine Kreise. Die Rinde ist nicht glatt – und auch der Blitz bahnt sich seinen Weg nicht gerade. Benoît B. Mandelbrot, The Fractal Geometry of Nature #1 #2 #3 #4 Im Gegensatz zu den in der Natur vorkommenden Pflanzen, sehen alle Strukturen, welche mit demselben L-System erzeugt wurden, identisch aus. Demnach muss ein Verfahren eingesetzt werden, um einzelne Elemente zu variieren, ohne aber den Gesamteindruck der »Pflanzenart« zu zerstören. Eine Möglichkeit ist die Verwendung von Stochastischen L-Systemen. Dabei gibt es für ein Zeichen mehrere Ersetzungsregeln. So könnte zum Beispie »F« mit »F[+F]F[-F]F« oder »F[+F]F« oder »F[-F]F« ersetzt werden. Welche der Ersetzungsregeln angewandt wird, wird per Zufall entschieden.27 Eine andere Möglichkeit ist, das L-System nicht deterministisch aufzufassen, sondern kleine Mengen an Zufallsfaktoren hinzuzufügen. Letztere Variante wird schrittweise auf dieser Doppelseite dargestellt. #6 #7 #5 27 vgl. F. Breier: L-Systeme und andere künstliche Pflanzen S 8 f. #1 Alle mit dem L-System erzeugten Pflanzen sehen identisch aus. #2 Statt Geraden werden Kurven verwendet, wobei jeweils ein variabler Kontrollpunkt zwischen Start- und Endpunkt des Baumsegmentes eingefügt wird. #3 Die Winkel werden mit einem Zufallsfaktor modifiziert. #4 Die einzelnen Ast- und Baumsegmente haben nun unterschiedliche Längen. #5 Die Linienstärke nimmt zu den Ästen hin ab. #6 An die Äste werden Blätter gesetzt. Diese werden als Bild in das Programm geladen. #7 Die Größe und die Farbe der Blätter variiert. 55 Pflanzen #8 #1 #7 #4 #9 #2 #3 In dieser Übersicht werden unterschiedliche LSysteme, bestehend aus einem Axiom und den dazugehörigen Ersetzungsregeln, ihren grafischen Repräsentationen gegenüber gestellt. #5 #6 #10 #11 #12 #1 Axiom X #2 Axiom a #4 Axiom XY #6 Axiom X #8 Axiom VZFFF #9 #10 Axiom F #12 Axiom F F --> FF F --> >F< X --> X[-FF][+FF] F --> FF V --> [+++W][--W]XV Axiom [[+F]+F][X+[-X]][-F+X] F --> F[+F]F[-F]F F --> FF-[XY]+[XY] X --> F-[[X]+X]+F[+F]-X a --> F[+x]Fb< Y --> YFX[+Y][-Y] X --> F[+X][-X]FX W --> +X[-W]Z F --> FFb[+X][-F]aX #11 Axiom FFF X --> +FX #3 Axiom F b --> F[-y] Fa #5 Axiom X #7 Axiom FX X --> -W[+X]Z X --> [FF[+X]] F --> F[+FF][-FF]F[-F][+F]F Y --> -FX F --> F[-F]F[+F][F] x --> a F --> FF X --> FF[-FX]+FX Y --> [+FF]YZ a --> F[-F] y --> b X --> F[+X]F[-X]+FX Z --> [+FF]F b --> aXF 57 Projekte Es geht nicht darum, Naturformen zu kopieren, sondern darum, in die Naturprozesse einzudringen und sie durch den menschlichen Geist umzuwandeln, ohne sie zu denaturieren. Alan Powers, Natur und Design S. 11 Stengel Inspirit ist dieses Projekt von den mikroskopischen Aufnahmen der Querschnitten von pflanzlichen Wurzeln und Sprossachsen. Charakteristisch für diese Ansichten sind die klar erkennbaren Zellstrukturen, welche sich ringartig in lockeres und dichteres Gewebe untergliedern. Ein weiterer Gedanke bei dem Projekt war, dass die generierten Sprossachse nicht beliebig sind, sondern hinter jeder Grafik eine Bedeutung steht. In diesem Fall wurden die Daten von Fotos, genauer gesagt die Farbanteile, dazu herangezogen. Voronoi Ein Voronoi-Diagramm zerlegt einen gegebenen Raum in Regionen basierend auf einer gegebenen Menge von Punkten. Dabei nimmt jeder Voronoi-Punkt genau eine Region ein. Die Regionen haben die Eigenschaft, dass alle Positionen innerhalb der jewei- LEE BYRON: MESH LIBRARY www.leebyron.com/else/mesh/ ligen Region ihrem Voronoi-Punkt näher ist, als allen anderen Voronoi-Punkten.28 28 vgl. C. Raskob: Schwerpunkt-Voronoi-Diagramme S. 11 IMAGEFROMAPI lädt Bilddateien nach einem bestimmten Suchbegriff über die flickr API in das Programm und veranlasst, dass diese analysiert werden. IMAGEANALYZER anlysiert das Bild nach seinen Farben und Farbanteilen. COLORSAVER enthält den Farbwert, wie häufig und wo im Bild die Farbe gefunden worden ist. SEGMENTS erzeugt aus den Ergebnissen von »ImageAnalyzer« Ringe, welche jeweils den prozentualen Farbanteil des jeweiligen Bildes repräsentieren. Innerhalb von diesen Ringen werden per Zufall Punkte verteilt, welche dann die Grundlage für die Voronoi-Regionen bilden. Da nicht alle Punkteverteilungsvarianten ein funktionierendes Voronoidiagramm ergeben, könnte das Programm an dieser Stelle abstürzen. Diese Fehlerquelle wird mit einer »Exception« aufgefangen. DISPLAYER erzeugt aus den in »Segments« erstellten Punkten VoronoiRegionen. Diese werden dann mit der in »ImageAnalyzer« gefundenen Farbe gefüllt. BILD http://www.flickr.com/photos/dianalange/sets/72157629453008849/ Ein mit Lee Byrons Mesh Library erstelltes Voronoi-Diagramm mit zufällig verteilten Voronoi-Punkten (blau). 59 Stengel Ähnlich dem Weave-Projekt basiert auch diese Arbeit auf einen Algorithmus, der die Farbanteile von Fotos analysiert. Daher konnte ein Teil des Codes aus dem WeaveProjekt weiterverwendet werden. Schritt eins ist also, ein Foto in das Programm zu laden. Dies kann entweder direkt eine Bilddatei sein oder ein Foto wird mittels der Library »proXML« über die flickr API gesucht (Bild oben). Sobald das Bild geladen wurde, wird es nach seinen Farben und den Farbanteilen analysiert. Aufgrund dieser Daten werden Ringe angelegt, welche jeweils den prozentualen Anteil der gefundenen Farbe repräsentieren. Je dicker also ein Ring ist, desto häufig kommt die Farbe im Bild vor (Bild unten). Innerhalb von diesen Ringen werden zufällig Punkte verteilt. Die Dichte der Punkte gibt den Helligkeitswert der Farbe an (Bild oben). Diese Punkt werden dann einer Instanz der Klasse »Voronoi«, welche durch die Einbindung der »Mesh« Library verwendet werden kann, übergeben. Diese berechnet daraus das Voronoi-Diagramm. Die Ko- ordinaten sämtlicher Eckpunkte aller entstandenen Zellen können über »Voronoi« abgefragt werden. Dadurch ist es möglich, das Aussehen der Zellen manuell zu konfigurieren und sie entweder eckig oder eher rund aussehen zu lassen (Bild unten). 61 Projekte EinTeil der allgemeinen Lektion der Natur ist das Verständnis, wie Ordnung und Chaos zueinander in Beziehung stehen. Alan Powers, Natur und Design S. 33 Weltall Elementarer Bestandteil dieses Projektes ist das Prinzip von Ordnung und Chaos. Wie viel Ordnung bzw. Gleichmäßigkeit verträgt ein Objekt, ohne dass dieses nach Geometrie und Mathematik aussieht? Und wie viel Unordnung verträgt es, ohne dass es beliebig wird? Visualisiert wird dieses Thema als Variationen von Himmelskörpern, welche über ein Raster, Zufall (random) und Rauschen (noise) erzeugt werden. ZUFÄLLE GIBT‘S! http://magazin.c-plusplus.de/artikel/ Zuf%E4lle%20gibt%60sFragezeichenAusruf ezeichen%20-%20Funktionen%20rund%20 um%20rand%2C%20Random%20und%20 den%20Zufall RANDOM IN PROCESSING www.openprocessing.org/sketch/59360 Zufall Der Zufall in der Informatik ist eng Verbunden mit der Wahrscheinlichkeitsrechnung, denn Computer können nicht wirklich zufällig arbeiten, sondern jeglicher Zufall wird über eine Algorithmus simuliert.29 In Processing geschieht die Erzeugung von Zufallszahlen über die Funktion »random (min, max)«, wobei eine zufällige Zahl zurück gegeben wird, welche sich innerhalb des angegebenen Minimal- und Maximalwertes befindet. 29 vgl. magazin.c-plusplus.de: Zufälle gibt‘s! BILD http://www.flickr.com/photos/dianalange/sets/72157629572630943/ CODE http://www.openprocessing.org/sketch/31151 Die Grafik ist eine Visualisierung der Zufallsfunktion »random()« in Processing. Gegeben ist ein Wertebereich, in diesem Fall von Null bis 100. Bei jedem Loop soll random() eine Zahl aus diesem Wertebereich auswählen. Jeweils ein Balken der Grafik stellt eine Zahl dar. Je öfter eine Zahl per random() ausgesucht wurde, desto höher ist der Balken. Der blau hinterlegte Balken steht für die Zahl, die am häufigsten ausgewählt wurde, der blaue Kreis die am wenigsten ausgewählte Zahl. Die Grafik zeigt die Häufigkeitsverteilung der ausgewählten Zahlen nach 1.000.000 Durchgängen. Die häufigste Zahl war die Nummer 43 (10217 mal ausgewählt, entspricht 1,02%), die geringste Zahl war die Nummer 75 (9752 mal ausgewählt, entspricht 0.98%). Daraus lässt sich schlußfolgern, das der in Processing verwendete Zufallsalgorithmus nur bedingt zufällig ist. Denn er hat deutliche Tendenzen, welche Zahlen generiert werden und welche nicht. 63 Weltall Der Mond ist ein Zusammenspiel aus zwei Elementen: Zuerst werden auf den Umfang eines Kreises zufällig Punkte verteilt, diese ergeben die äußere Kontur des Mondes. Zweitens werden innerhalb dieses Mondkreises weitere Punkte verteilt, welche sich jeweils auf den Umfang von kleineren Kreisen befinden. Diese kleineren Kreise simulieren die Krater des Mondes. Anschließend werden viele Linien zwischen je zwei zufällig gewählten Punkten gezeichnet. Durch die Verdichtung der Linien entsteht sowohl die Struktur der Mondoberfläche als auch die leicht dreidimensionale Wirkung. Auf drei verschieden großen Kugeln werden zufällig Punkte gelegt. Auch hier werden anschließend viele Linien zwischen zwei zufällig gewählten Punken gezeichnet. Einzige Bedingung ist, dass die zwei Punkte jeweils auf der gleichen Kugel liegen. Zu beachten sind die Verdichtungen an den Polen der Kugeln. Hier wird eine Kombination von noise() und random() verwendet. Dabei variiert die Gewichtung des Zufalls und des Pseudozufalls in Abhängigkeit von der Position auf der Kugel. Benachbart liegende Punkte werden miteinander verbunden und ergeben eine durchgängige Linie. Die Basis für dieses Beispiel ist ein recht starr angelegtes Raster mit nur wenig Variation. Das natürliche Aussehen entsteht ausschließlich durch die Vielzahl an feinen, sich kreuzenden Linien und der Drehung der Kugelformen im Raum, so dass die Pole der Kugeln unterschiedlich positioniert sind. 65 Projekte Ist die Natur langweilig? So scheint es, wenn sie als tote Materie dargestellt wird, wie dies in wissenschaftlichen Fächern oft der Fall ist. Die Vorstellung der lebenden Natur wurde von Dichtern und Visionären beschrieben, die oft als Fantasten belächelt wurden. [...] Für den Designer lässt sich die Unterscheidung nicht durch Experimente , sondern durch die Qualität der Arbeit nach der Natur beweisen. Alan Powers, Natur und Design S. 11 Kugel KEN PERLIN: DER NOISE ALGORITHMUS www.mrl.nyu.edu/~perlin/doc/oscar.html JOSEPH NECHVATAL: IMMERSION INTO NOISE www.openhumanitiespress.org/immersion-into-noise.html WOLKENFLUG www.openprocessing.org/sketch/56265 BILD http://www.flickr.com/photos/dianalange/sets/72157629206969340/ Rauschen Rauschen beschreibt in der Physik eine Störgröße, welche durch die Überlagerung von Schwingungen oder Wellen entsteht.30 Ge- Heigtmap läufige visuelle Beispiele sind u.A. das Bildrauschen bei hohen Heightmaps oder Höhenfelder sind zweidimensionale Felder, ISO-Werten in der Fotografie und der »Ameisenkrieg« bei feh- welche der Beschreibung von Höhenreliefs dienen. Die Höhen- lendem Senderempfang im Fernsehen. Dieses Phänomen kann daten werden in einer Rastergrafik als Helligkeitswerte abgespei- über ein mathematisches Modell beschrieben werden, genannt chert. Das heißt, je höher der Wert ist, desto heller ist der Grau- »Weißes Rauschen«.31 wert. Die zweidimensionale Grafik bildet demnach die Grundlage für die Generierung der Oberfläche eines dreidimensianelen Objektes. Um das Relief zu erstellen wird die Rastergrafik abgetastet Wie bereits bei dem Projekt »Stengel« entstand diese Arbeit aufgrund meiner Faszination für mikroskopische Aufnahmen. Daher ist es nicht verwunderlich, dass einige optischen Vorbilder aus einer Gallerie eines Herstellers von Mikroskopen (www.fei.com) stammen. Die Makroaufnahmen von Pollen, Kohle, Eisen, Algen, Sporen usw. sind dabei ästhetische Grundlage. Was nicht bedeuten soll, dass diese »nachgebaut« werden. Vielmehr sollen die mit der Rauschfunktion erzeugten Kugeln daran erinnern und frei mit dem Thema assoziiert werden. und der Helligkeitswert bestimmt dann den z- bzw. Höhenwert Perlin Noise an einer bestimmten Position des Polygonnetzes. Diese Technik Noise ist eine fraktale Rauschfunktion. Sie wird zur Bildsynthese wird oft in der Computergrafik verwendet, da der Speicherauf- natürlicher Phänomene, wie Wolken, Landschaften und Wasser, wand sehr gering ist.34 verwendet.32 Ken Perlin, nachdem diese Funktion benannt wurde, hat Perlin Noise entwickelt um Sachen, z.B. Bilder und Oberflächen, unregelmäßig genug aussehen zu lassen, wodurch die- NOISEMAKER erstellt mithilfe der noise Funktion und/oder anderen Algorithmen ein Heightmap. NOISESPHERE interpretiert das Heightmap und generiert daraus ein kugelartiges Objekt. se interessanter und natürlicher erscheinen. Die Funktion selbst macht nicht viel anderes, als ein einfaches, sich nicht wiederholendes Muster zu generieren. Noise gehört nicht zu den Zufalls- 30 vgl. wikipedia.de: Rauschen (Physik) funktionen, Noise ist pseudozufällig. 31 vgl. wikipedia.de: Weißes Rauschen 33 32 vgl. wikipedia.de: Perlin Noise 33 vgl. Ken Perlin: Making Noise 34 vgl. wikipedia.de: Höhenfelder 67 Kugel Auf dieser Doppelseite ist eine Auswahl der entstandenen Kugelobjekte zu sehen. Die Variationen wurden über verschiedene Experimente mit der Noisefunktion generiert. Unter anderem wurde das Rauschen mit Winkelfunktionen, bitweisen Operatoren und dem booleschen Operator XOR (Wahrheitsabfrage »Entweder Oder«) verfremdet. Eine Kombination aus noise() und bewusst eingebauten Störungen ergibt das Heightmap. Die Ausgangsform ist eine Kugel, welche aus 200x200 Polygonen besteht. Zu sehen ist, dass sich das Gitter zu den Polen hin verdichtet. Dieser Effekt entsteht durch die Abnahme des Kreisdurchmessers und der gleichzeitig konstanten Anzahl der Polygone pro Kugelsegment. Das erzweugte Heightmap dient als Vorlage zur gezielten Deformation einer Kugel. Das in Processing gerenderte Bild weist deutliche »Zusammenfaltungen« an den Polen auf, welche durch die Polygonnetzverdichtung an diesen Stellen hervorgerufen werden. Links: Das als 3D-Modell im Dateiformat »DXF« exportierte Objekt wird in Cinema 4D importiert. In dem 3D Programm erfolgt die Lichtsetzung, eine minimale Oberflächenglättung und eine Belegung des Objektes mit einem Material. 69 Projekte BILD http://www.flickr.com/photos/dianalange/sets/72157629331606961/ CODE http://www.openprocessing.org/sketch/52738 Terrain Ziel dieses Projektes war es, unterschiedliche, dreidimensionale Geländeformen über einen Algorithmus zu generieren, welcher komplett ohne manuelle Konfiguration funktioniert. Die Idee für die programmiertechnische Umsetzung stammt von Thomas Jourdan: Über eine Noisefunktion wird ein Heightmap erstellt, welches nach und nach über verschiedene Filter so verändert wird, dass ein Terrain entsteht. Random Walk Der Random Walk, zu deutsch Zufallsbewegung oder auch Irrfahrt, basiert auf einem stochastischen Prozess. Er findet Verwendung in der Herleitung von Wahrscheinlichkeitsverteilungen.35 Unter Anderem kann auf diese Weise der zeitliche Verlauf beziehungsweise die Entwicklung von Marktpreisen nachvollzogen werden.36 Grafisch kann dieser Vorgang als wandernde Linie beschrieben werden, welche an einem zufälligen Punkt auf einer zweidimensionalen Fläche beginnt. Bei jedem Durchgang wird die Linie um einen Punkt erweitert. Dabei wird zufällig entschieden, ob die Linie nach oben, nach unten, rechts oder links weiter geht. Zusammenfassend lässt sich der Random Walk durch folgende Eigenschaften definieren: Alle Einzelentscheidungen sind autonom. Jeder Schritt hängt ausschließlich von der aktuellen Position ab und nicht von den vorher besuchten Plätzen. Jeder Teilschritt 35 vgl. wikipedia.de: Zufallsbewegung wird zu einem neuen Ausgangspunkt. Daher können Plätze 36 vgl. wikipedia.de: Random-Walk-Theorie mehrmals aufgesucht werden und der daraus entstehende Pfad 37. vgl. D. Heermann: Der Random Walk S. 1 weist Kreuzungen auf.37 TERRAIN dient der Darstellung und Anzeige der Landschaft. Die Klasse interpretiert das ihr übergebende zweidimensionale Bild und erstellt daraus das dreidimensiale Gelände. NOISEGENERATOR erstellt ein Heightmap welches der Klasse »Terrain« anschließend als Bild übergeben wird. »NoiseGenerator« erstellt dieses Bild und verändert es nach und nach durch eine Reihe von Filtern (z.B. »RandomWalk«). RANDOMWALK erstellt ein Bild, welches eine wandernde, weiße Linie mit zufälligem Verlauf und sich zufällig verändernder Linienstärke auf schwarzem Grund beinhaltet. WIE SIEHT DER ZUFALL AUS www.random-walk.com GENERATING RANDOM FRACTAL TERRAIN www.gameprogrammer.com/fractal.html INNER WORLD - A LANDSCAPE GENERATOR www.innerworld.sourceforge.net CRACKS erstellt ein Bild, welches zufällig positionierte, astartige Linien über ein rekusives Verfahren erstellt und als Bild abspeichert. ANCHOR steuert das rekursive Verfahren von »Cracks« und erzeugt die einzelnen Astabschnitte. BRANCH speichert die Anfangs- und Endpositionen der einzelnen Linienabschnitte ab, welche in »Anchor« erzeugt wurden und erstellt daraus eine geschwungene Linie. 71 Terrain Über eine zweidimensionale Noisefunktion wird ein Heightmap erstellt. Die Parameter für Noise, d.h. wie zufällig oder natürlich das Muster ist, werden zufällig bestimmt. Dadurch unterscheiden sich die generierten Geländeformen schon anhand der Feinheit der Struktur. Die Kontraste werden erhöht. Dadurch entstehen im Heightmap weiße, undifferenzierte Areale, welche in der 3D-Ansicht Flächen auf den Berggipfeln ergeben. Da diese flachen Plateaus unnatürlich wirken, wird anschließend das Bild invertiert (»oben« wird mit »unten« getauscht). Über ein RandomWalk-Prozess werden die Bergund Talregionen festgelegt. Um die kleinen »Rauheiten« der Oberfläche zu glätten wird das Heightmap über Mario Klingemanns »fastblur« Funktion leicht weich gezeichnet. Anschließend werden noch einmal die Kontraste erhöht, um deutlichere Bergregionen zu erhalten. Die Landschaft wirkt nun insgesamt zu glatt und zu gleichmäßg. Daher werden kleine Störungen eigebaut. Realisiert werden diese über die gleichen Klassen, welche schon für die Generierung von »Baum« und »Ast/Blume« verwendet wurden. Diese Störungen entsprechen den natürlich vorkommenden Erosionen, welche durch die Umweltgegebenheiten entstehen. Das nun fertige Modell wird als dxf-Datei exportiert. In Cinema 4D wird das Modell importiert, weiter 73 verarbeitet (Lichtsetzung, Ausschnitt, usw.) und anschließend als hochauflösendes Bild gerendert. Quellen Quellen, & Links Bildnachweis QUELLEN BILDNACHWEIS LINKS Breier, Florian: L-Systeme und andere künstliche Pflanzen (pdf). Berlin, 2009 ••• Klanten, Robert; Hellige, Hendrik [Hrsg.]: Su- cs.berkeley.edu/~vazirani/algorithms/chap2.pdf, eingesehen S.6: theverymany.com ••• S.8-9: #1 theverymany.com, #2 & http:// http://apod.nasa.gov/apod/ap030425. bourke.net/fractals/lsys/index.html ••• roxiemike.wordpress. http://graphics.uni-ulm.de/lehre/courses/ss02/Computergra- personic. Visuals for Music. Die Gestalten Verlag GmbH & Co. am 07. März 2012 ••• Wolf, Jürgen: C++ von A bis Z. Das um- #4 francisbitonti.com, #3 & #7 n-e-r-v-o-u-s.com, #5 flickr.com: html ••• http://biodiversitylibrary.org ••• www. biokurs.de/ com/2010/01/09/is-this-the-year-we-win-at-romanesco/ ••• fik/ ••• Brooks, Robert; Matelski, J. Peter: The dynamics of KG, Berlin, 2007 ••• Neubert, Eberhard: Albrecht Dürer. Pflan- fassende Handbuch. Galileo Press, Bonn, 2006 jonathanmccabe, #6 tomasz-starczewski.com, #8 anf.nu, #9 skripten/12/bs12-5.htm ••• http://biothing.org ••• http:// http:// sumo.de/definition-api.html ••• http://theverymany. 2-generator subgroups of PSL(2,C), in Riemann surfaces and re- zen und Tiere. VEB E.A.Seeman Buch- und Kunstverlag, Leipzig marcinignac.com, #10 & #11 justinlivi.net, #12 biothing.org ••• briancarper.net/tag/216/mandelbrot ••• http://creativecom- com ••• http://tomasz-starczewski.com ••• http://velocirap- lated topics: Proceedings of the 1978 Stony Brook Conference, ••• Okamoto, Naomi: Japanische Tuschemalerei für Einsteiger. S.12-13: #1 & #6 Dobler: Schmuck//Juwellery S.104 & 108, #2 puting.cc/p5libs/proxml ••• http://de.flash-screen.com/free- tor.mni.fh-giessen.de/Programmierung/progI-html-dir/node7. Annals of Mathematics Studies, Band 97, Princeton University Ein Malkurs in Beispielen. Augustus Verlag, München, 2001 ••• & #4 Klanten: Supersonic S.200 & 313, #3 & #7 Powers: natur wallpaper/mask/beautiful-mask,1280x1024,32880.html ••• html#SECTION00072000000000000000 ••• http:// weave. Press, Princeton, N.J., 1981, S.65-71 ••• Burger, Wilhelm: Gra- Powers, Alan: natur und design. Inspirationen für Architektur, und design S.19 & 122, #5 & # 7 & #8 & #10 & #11 Sachs: www.fei.com ••• www.flickr.com ••• http://francisbitonti.com de ••• http://wikipedia.de ••• http://www.willemer.de/infor- dientbasierte Rauschfunktionen und Perlin Noise (pdf). http:// Mode und angewandte Kunst. Verlag Paul Haupt, Bern, Stutt- Nature Design S.32 & 62 f & 136 & 172 f ••• S.18-19: #1 ••• http://lexikon.martinvogel.de/api.html ••• http:// justinlivi. matik/java/javaclas.htm ••• http://www.zitate-aphorismen.de staff.fh-hagenberg.at/burger/publications/index.html ••• Do- gart, Wien, 2000, S. 1-122 ••• Prusinkiewicz, Przemyslaw: Self- & #3 biodiversitylibrary.org, #2 Neubert: Albrecht Dürer Tafel net ••• http://magazin.c-plusplus.de/artikel/Zuf%E4lle%20gib bler, Georg: Schmuck//Jewellery. 1980-2010. ARNOLDSCHE Similarity in Plants: Integrating Mathematical And Biological 24, #4 Okamoto: Japanische Tuschemalerei S.62, #5 flickr.com: t%60sFragezeichenAusrufezeichen%20-%20Funktionen%20 Art Publishers, Stuttgart, 2010 ••• Fleischer, Kevin: Rekursion Perspectives. In M. Novak (Hrsg.). Thinking in Patterns. Fractals The_White_Deer, #6 Sachs: Nature Design S.19, #7 flickr.com: rund%20um%20rand%2C%20Random%20und%20den%20 und Iteration (pdf). http://kfleischer.delphigl.com/tutorials.php and Related Phenomena in Nature. World Scientific, Singapore, little worries ••• S.22-23: #2 biokurs.de, #3 commons.wiki- Zufall ••• http://marcinignac.com ••• http://www.mathe- ••• Heermann, Dieter W.: Ein Bespiel: Der Random Walk (pdf). 2004, S. 103-118 ••• Raskob, Christian: Schwerpunkt-Voronoi- media.org: Scapania undulata Blattzellen, #7 briancarper.net, online.at/materialien/matroid/files/fraktale/fraktale.html http://wwwcp.tphys.uni-heidelberg.de/statmech ••• Jordan, Diagramme (pdf). http://www.raskob.de/fun/d/#d ••• Sachs, #8 roxiemike.wordpress.com, #9 tapeta.info, #10 wikipedia. www.mikroskopie-forum.de Thomas: Generierung virtueller Geländeformen durch Rausch- Angeli: Nature Design. Von Inspiration zu Innovation. Züricher de: Antennae Hubble, #11 apod.nasa.gov ••• S.34: de.flash- com/talk1/index.html ••• http:// onformative.com ••• http:// funktionen und Filter (pdf). http://innerworld.sourceforge.net Hochschule der Künste ZHdK, Züricher Fachhochschule und Lars screen.com ••• S.38: weave.de & onformative.com ••• S.40: www.ozok-online.de/dekoration-dekosteine-gartensteine- ••• Klanten, Robert; Hellige, Hendrik [Hrsg.]: Illusive. Contem- Müller Publishers, 2007 ••• Vazirani, Umesh V.: Algorithms. ozok-online.de ••• S.58: Daniel Steiner/ mikroskopie-forum.de heilsteine/sandrosen/sandrosen-grösser-1kg/ ••• http://paul- porary Illustration Part 3. Die Gestalten Verlag GmbH & Co. KG, Chapter 2. Divide-and-conquer algorithms (pdf). http://www. ••• S.66: fei.com ••• alle Anderen: Diana Lange anf.nu ••• ••• ••• http://www.noisemachine. 75 Impressum © 2012. Diana Lange. Alle Rechte vorbehalten. www.diana-lange.de Matrikelnummer: 532853 Text, Gestaltung und Umsetzung: Diana Lange Entstanden im Modul »Integratives Projekt« an der HAWK FH HHG im Studiengang Master of Arts Geprüft von Prof. Marion Lidolt Prof. Stefan Wölwer Sommersemester 2012 www.hawk-hhg.de