Grafische Programme (LCGI)



Voraussetzung: LCGI


Voraussetzung für ein erfolgreiches Kompilieren dieser Programme ist die Grafikbibliothek LCGI (Linux Common Graphics Interface), welche ähnliche Funktionen wie die Bibliotheken von Turbo C oder Turbo Pascal bereitstellt. Eine genaue Beschreibung der LCGI findet man auf SuSE-Press als downloadbare PDF-Datei.
Zur Installation der LCGI einfach folgendes Archiv downloaden:

LCGI 1.0 [download]

...entpacken und den Instruktionen der README-Datei folgen.
Fertig installiert steht nach den entsprechenden Einträgen in die ./bashrc das neue Kommando "lcc" zur Verfügung, das sich äquivalent zu "gcc" benutzen lässt.


1. Simulation eines zellularen Automaten

So sieht's aus... Game of life Sourcecode: life.c [download]

Beschreibung
Das Programm life.c simuliert einen zellularen Automaten in Form des "Game of life" des englischen Mathematikers John H Conway. Veranschaulicht man sich diesen zellularen Automaten, so ist er eine in Quadrate (Zellen) aufgeteilte Ebene. Jede Zelle hat nun die Möglichkeit zur Selbstreproduktion, die jeweils nach einer vorgegebenen Zeit stattfindet. Dabei gelten folgende Regeln:
  • Eine tote Zelle wird "geboren", wenn genau drei ihrer acht Nachbarn leben.
  • Eine lebende Zelle stirbt, wenn mehr als drei (Tod durch Überbevölkerung) oder weniger als zwei (Tod durch Vereinsamung) ihrer acht Nachbarn leben. Eine Zelle bleibt also nur dann am Leben, wenn genau zwei oder drei ihrer Nachbarn leben.
Das Programm realisiert so ein "Game of life". Dabei kann der Benutzer anfangs die Anzahl der Felder angeben und als nächstes die Anfangspopulation entweder per Maus oder per Zufall "zum Leben erwecken". Danach startet die Simulation.
Der Reiz besteht darin, dass man nicht vorhersehen kann, wie sich die Population entwickelt. So kann sie komplett aussterben, irgendwann einen stabilen Zustand erreichen oder sich immer weiter vermehren.
Dabei spielt die Wahl der Anfangspopulation eine entscheidende Rolle. Interessante Figuren sind z.B. folgende:
Game of life Figuren
Es gibt noch viel mehr interessante Muster. Ausprobieren!

Achtung: uncompleted!
Leider kann ich nicht sagen, dass das Programm fehlerfrei und nach meiner ganzen Zufriedenheit läuft, aber im Moment habe ich einfach keine Zeit, daran großartig etwas zu ändern. Zwar funktioniert die Simulation des Lebens tadellos, auch Kollisionsprobleme mit den Feldrändern werden berücksichtigt. Trotzdem hier ein paar der Fehler, die mir einfallen:
  • Statische Zellgröße: Die Zellgröße ist mit den Konstanten XLAENGE und YLAENGE in life.c fest vorgegeben. D.h., dass es zu Problemen bei großen Feldern kommen kann, die erstens darauf beruhen, dass die Feldgröße den Bildschirmrand überschreitet und zweitens zu einem Überlauf des nur mit int deklarierten Feldarrays führen kann. Lösung wäre ein long int Array mit dynamischen Zellgrößen, ich werde versuchen, dies in nächster Zeit zu realisieren.
  • Geschwindigkeitsprobleme bei großen Feldern: Das Programm wird arg langsam, wenn man große Felder realisieren will. Dagegen ist mithilfe der LCGI leider kein Kraut gewachsen. Nach vielem Probieren kann ich nun sagen, dass auf schnellen Rechnern ein Feld von ca. 100 x 80 Zellen (oder weniger) optimal ist.
  • Unsauberer Code: Wer genauer hinschaut, wird es sicher bemerken: der Code ist nicht der Beste. So ist er kaum kommentiert und auch ein wenig unelegant. Verbesserungen werde ich einbringen, sobald ich die Zeit dafür finde...


2. Zeichnen von Figuren

So sieht's aus... Figzeich Sourcecode: figzeich.c [download]

Beschreibung
Wie der Name schon andeutet, handelt es sich um ein einfaches Zeichenprogramm, mit dem das Zeichnen der Figuren: Rechteck, Quadrat, Ellipse, Kreis, Linie und einer freien Form möglich ist. Diese kann man, wenn man will, auch noch farbig ausmalen (bis auf die Linie und die freie Form). Alles weitere erklärt der Einführungsbildschirm des Programms.

Der Code ist nicht der Sauberste, zudem ist er komplett in main() enthalten, was nicht von prozeduraler Programmierweise zeugt. Nichtsdestotrotz habe ich ihn vollständig kommentiert, das Programm funktioniert auch soweit ohne Bugs...


3. Fraktale Geometrie

Wohl niemals zuvor hat ein Gebiet der Mathematik soviel öffentliche Aufmerksamkeit erregt wie das der Fraktale. Mit Fraktalen lassen sich faszinierende Grafikbilder erzeugen, wobei ein Fraktal selbst eine geometrische Figur ist, die sich ständig in sich selbst in einem kleineren Maßstab wiederholt. Dabei wird der Umfang einer Figur bei begrenztem Raum unendlich groß, was ein mathematisches Paradoxon darstellt. Zwei interessante Figuren, nämlich das Zeichnen einer idealen Schneeflocke und eines veränderbaren L0-Systems, sollen nachfolgend dargestellt werden.

3.1 Die Kochsche Schneeflocke

So sieht's aus... Kochsche Schneeflocke Sourcecode: koch.c [download]

Beschreibung
Die Kochsche Schneeflocke ist ein gutes Beispiel für ein Fraktal. Sie ist nach dem schwedischen Mathematiker Helge Koch benannt, der sie 1904 als erster beschrieb. Für die Transformation gilt folgende Regel:
In der Mitte jeder Seite wird bei jedem Durchlauf ein neues Dreieck hinzugefügt, das nur ein Drittel der Größe des vorangegangenen Dreiecks besitzt.
Durch diese Transformation wird aus einem Davidstern nach n Transformationen eine scheinbar ideale Schneeflocke...

3.2 Ein weiteres L-System

So sieht's aus... L0-System Sourcecode: lsystem.c [download]

Beschreibung
1968 hat A. Lindenmayer die Theorie der L-Systeme entwickelt. Auf die einzelnen Produktionsregeln will ich hierbei nicht weiter eingehen, doch durch rekursive Funktionsaufrufe lassen sich mit L-Systemen interessante fraktale Gebilde erstellen, die bei entsprechendem Regelwerk Pflanzen ähneln können. Das hier vorgestellte L-System soll ein Beispiel dafür sein.

3.3 Ein Fraktalstern

So sieht's aus... Fraktalstern Sourcecode: fraktalstern.c [download]

Beschreibung
Angeregt durch das Buch " Algorithmen in C" von R. Sedgewick habe ich dieses kurze Programm auf Basis der LCGI geschrieben. Es beinhaltet eine Funktion star(), die sich rekursiv immer wieder selber aufruft, bis der Radius (1/2 der Seite eines Quadrats) kleiner 1 wird. In diesem Fall zeichnet die Funktion ein Rechteck (sprich: Quadrat) auf den Bildschirm, wobei das endgültige Ergbnis einem sternförmigen Muster gleichkommt.
An diesem Beispiel soll verdeutlicht werden, wie relativ komplex aussehende Gebilde sehr einfach mit rekursiven Funktionsaufrufen realisiert werden können...

(c) 2003 by RTC, www.linux-related.de
Dieses Dokument unterliegt der GNU Free Documentation License