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...
|
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:
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...
|
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...
|
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...
|
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...
|
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...
|
|