>> MandelPrint << Sind Sie auch so begeistert von der Schönheit der Fraktale ? Der Amiga hat mit seinen 4096 Farben und der hohen Rechengeschwindigkeit diese Begeiste- rung bei mir erst richtig entfacht. In der Public Domain gibt es mindestens ein Dutzend "Apfelmännchen"-Generatoren, aber allen ist eins gemeinsam : Sie stellen die Apfelmännchen auf dem Bildschirm dar. Nun, das wäre so beson- ders auch nicht, schließlich ist der Bildschirm dafür ja da. Nur - erstens sind die Bilder - so schön sie auch sein mögen - nicht dauerhaft (Computer aus, Bild weg), und zweitens sind die Hardcopies, die manche Programme ermög- lichen, nur von minderwertiger Qualität. Dies ist kein Fehler der Hardcopy- Routine, sondern, wenn man so will, des Amiga, da dessen Bildschirm-Auflösung von maximal 640*512 Punkten (ohne Overscan) weit hinter der jedes Druckers liegt. Deshalb schrieb ich dieses Programm. Es zeigt die Apfelmännchen NICHT auf dem Bildschirm an, sondern gibt sie direkt auf den Drucker aus - genauer auf den NEC P6. Dazu wird die höchste Auflösung verwendet, die dieser zu bieten hat, nämlich 360*360 DPSQI (dieses unaussprechliche Dings heißt Dots Per SQuare Inch ; Punkte pro Quadratzoll). Warum NEC P6 ? Nun, erst einmal ist der NEC nicht der einzige Drucker, mit dem MandelPrint zusammenarbeitet. Ohne Änderung läuft dieses Programm auch auf allen anderen NEC-Druckern und allen EPSON-LQ-Kompatiblen. Ansonsten ließe sich das Pro- gramm vermutlich leicht auf alle anderen 24-Nadler umschreiben (tut mir leid, 9-Nadler und Nähmaschinen werden leider nicht unterstützt). Wie das geht, werde ich unten unter "TECH INFO" zu erklären versuchen. ÜBER DAS PROGRAMM MandelPrint wurde 100% in Assembler geschrieben. Grund: Eigentlich gefällt mir C viel besser, aber in diesem Programm wird SOOO viel gerechnet,daß jede Verzögerung ÄRGERLICHST wäre. Allerdings - muß ich zugeben - glaube ich, daß MandelPrint noch schneller sein könnte, denn ich habe mir um Optimierung noch keine allzu großen Sorgen gemacht. Hauptsache 's läuft ! Wie schon in der Einleitung bemerkt, gibt es in der Public Domain schon sehr viele Mandelbrot-Programme (Benoit Mandelbrot war der Entdecker der Apfel- männchen). Deshalb ist MandelPrint nur als Ausdruck-Programm, nicht aber als Forscher-Programm gedacht. Mit MandelPrint (ich glaube, ich kürze das mal ab als MP) hat es keinen Sinn, auf die Suche nach schönen Mustern zu gehen; ich empfehle, daß Sie sich mit Hilfe von MandFXP (dem mit Abstand schnellsten Programm !) oder einem anderen Mandelbrot-Programm auf diese Suche begeben. Die Koordinaten, die man von diesen Programmen erhält, können dann direkt in MP eingegeben werden. NUN ABER ZUR PRAXIS ! MP schaltet beim Berechnen das Multitasking aus. Jeder andere Task, der noch laufen sollte (dazu zählt auch das input.device, das den Mauszeiger bewegt), wird angehalten. Wenn also nach Rechenbeginn auf einmal nichts mehr gehen sollte, dann ist das kein Totalabsturz, keine Sorge ! MandelPrint führt den Benutzer Schritt für Schritt zum fertigen Apfelmänn- chen. Alles Wissenswerte wird auf dem Bildschirm angezeigt (CLI-Fenster am besten auf volle Größe bringen !). Gehen wir einmal einen Programmablauf durch. Wir wollen, daß uns das "Standart-Apfelmännchen" ausgedruckt wird. Nach dem Start meldet sich MP mit einem kurzen Text und bittet gleich darauf um die Eingabe des Wertes für den linken Rand des zu betrachtenden Ausschnitts. Geben Sie hier < -2 > ein. Als nächstes der Wert für den rechten Rand : <0.7> Dann der untere Rand : < -1.25 > und der obere Rand : < 1.25 > Zuletzt die Angabe, wieviele Iterationen pro Punkt (wird gleich erklärt) höchstens gemacht werden sollen : < 50 > Bei all diesen Angaben bitte eins beachten: Die Zahlumwandlungs-Routine ist nicht gerade die universellste. Andere Zeichen als 1,2,3,4,5,6,7,8,9,0,. und - sind nicht erlaubt und führen zu falschen Ergebnissen. Also können Zahlen nicht in Exponentialschreibweise eingegeben werden (wer nicht weiß, was das heißt, wird's auch nicht falsch machen), es dürfen keine Leerzeichen vor der Zahl getippt werden, ein führendes Pluszeichen ist auch nicht drin, und eine Zahl darf nicht mit einem Dezimalpunkt beginnen. Also : Erlaubt Nicht erlaubt 0.123562476246 .123562476246 -1.35 +2 2.001 2,001 100 1e2 Nun noch etwas zu den Zahlen : Die kleinste mögliche Koordinate beträgt -2, die größte +2. Größere bzw. kleinere haben auch keinen Sinn, da dort sowieso nichts Besonderes zu sehen ist. Auf richtig falsche Eingaben wird im übrigen hingewiesen. Bevor die Rechnerei beginnt, bekommt man noch einmal die Chance zum Aus- stieg, wer die nicht wahrnimmt, wird merken, daß sein Computer auch bald nichts mehr wahrnimmt - Multitasking ist ausgeschaltet. Auch die Maus rührt sich also nicht mehr vom Fleck. Für den Fall, daß man einen ganz langen und schmalen Ausschnitt gewählt hat, wird der Computer einen noch warnen, daß er das dann nicht auf einem DIN A4- Blatt unterbringt (Die Höhe des Bildes wird vom Computer berechnet, sodaß das Seitenverhältnis gewahrt bleibt), und man erhält die Möglichkeit abzu- brechen. Ansonsten kann's losgehen. Nun heißt es WARTEN... Nach einigen Sekunden (EINIGEN !!) wird sich der Drucker dann mal in Gang setzen. Für ein komplettes Bild kann er schon ein paar Stunden brauchen (das kommt auf die Zahl der maximalen Iterationen und der Größe des Bildes an). Für den Fall, daß jemand es nicht so eilig hat und lieber während der Rechenzeit noch was anderes mit dem Computer macht, gibt es zwei Möglich- keiten : 1.) Den Computer über Nacht laufen lassen (nur, wenn er druckt, ist das so laut) 2.) Das Programm ändern und alle Zeilen und rauswerfen. Dann das ganze neu assemblieren und starten. Ich kann aber gleich sagen, daß das sich nicht lohnt: Die anderen Tasks werden (außer man gibt ihnen eine höhere Priorität) nur ganz schön ruckelig und laangsam laufen... Übrigens wartet MandelPrint noch 5 Sekunden, bevor es das Multitasking abschaltet. Der Grund dafür: Etwa so lange dauert es, bis das parallel.device geladen ist. Wenn vorher Multitasking ausgeschaltet wird, bleibt die Disket- ten-LED an, was nicht gerade schön aussieht. Es bleibt also noch Zeit, den Workbench-Screen noch nach unten zu ziehen, bevor die Rechnerei losgeht (dann rechnet der AMIGA [noch] schneller). UNTERBRECHEN DES RECHENPROZESSES Alle 12 Punkte (also mehrere Male pro Sekunde) wird die HELP-Taste abgefragt. Wenn sie gedrückt ist, wird dem Benutzer die Möglichkeit gegeben, den Rechenprozeß abzubrechen. Natürlich kann er ihn auch fortsetzen lassen. Um diese Taste abzufragen, bediene ich mich allerdings eines nicht ganz feinen Tricks, den ich später unter TECH INFO noch erläutern werde. EIN BISSCHEN ZUR THEORIE Fast alle Dokumentationen zu den existierenden Mandelbrot-Programmen schwei- gen sich darüber aus, wie eigentlich diese tollen Bilder nun genau entstehen. Meistens wird auf das Buch "The Fractal Geometry Of Nature" vom Meister selbst (Benoit Mandelbrot, der IBM-Programmierer, dem wir die Apfelmännchen verdanken) verwiesen. Leider ist dieses sehr teuer; deshalb werde ich ver- suchen, einen kleinen Einblick in die Materie zu geben. Was bedeutet überhaupt denn das Wort "Fraktal" ? Die grundlegende Idee dazu läßt sich so beschreiben: Wir versuchen, die Länge der Küste von England zu bestimmen, indem wir sie abmessen. Zwei Leute sind für uns unterwegs; der eine mit einem 1m langen, der andere mit einem 3m langen Zollstock. Wie werden die Ergebnisse der beiden aussehen ? Nun, zunächst einmal ist es einleuchtend, daß der mit dem 1m-Zollstock ein höheres Ergebnis herausbekommt, da der 3m-Zollstock viele kleine Einbuch- tungen nicht messen konnte; der 1m-Zollstock konnte sich etwas besser an die Küste "anschmiegen". Ein 10cm-Lineal könnte das allerdings noch besser. Man sieht: je kleiner der Maßstab, desto größer das Ergebnis. Könnte man also den Maßstab unendlich klein wählen, würde man auch ein unendlich großes Ergebnis erhalten. Aber - wie lang ist die Küste denn jetzt? Welcher Maßstab ist der richtige ? Hier kommt nun der Begriff der fraktalen, der gebrochenen Dimension ins Spiel. Man sieht, daß die gesuchte Streckenlänge sich in einer Dimension nicht darstellen läßt. Zwei Dimensionen beschreiben aber eine Fläche und keine Strecke. Die gesuchte Dimension muß also - so komisch das klingt - zwischen 1 und 2 liegen. Der tatsächliche Wert liegt bei 1.26 . Und zwar errechnet der sich so: Man berechnet, um wieviel sich das Ergebnis vergrößert, wenn der Maßstab verkleinert wird. Dies ist eine lineare Funk- tion, man erhält in unserem Fall das Ergebnis (durch Messen) : Verkleinert man den Maßstab um 3, dann vervierfacht sich die Streckenlänge. Der Mann mit dem 1m-Zollstock von vorhin hätte also das vierfache Ergebnis des Mannes mit dem 3m-Zollstock erhalten. Die fraktale Dimension wird nach dieser Formel berechnet (unsere Werte sind gleich eingesetzt) : D = log 4 = ln 4 / ln 3 = 1.26 3 Die Formel ist allgemein noch komplizierter; für diesen Fall reicht sie aber aus. Die Länge der englischen Küste wird also wie folgt angegeben: Gemessene Länge in cm neben der fraktalen Dimension. Zusammen bestimmen diese beiden Zahlen genau das, was wir anfangs wissen wollten. Dies war als Einstieg in die Gedankenwelt um fraktale Gebilde gedacht. Beim Apfelmännchen wird uns die Frage nach der "Küstenlänge" noch einmal begegnen; ansonsten müssen wir uns wieder auf mathematisches Neuland wagen. Nun denn: Das ganze beruht auf der Menge der sogenannten "komplexen Zahlen". Tja, das ist der erste Hammer. Vielleicht können Sie am ehesten etwas damit anfangen, wenn ich Ihnen etwas über deren Eigenschaften erzähle. Eine komplexe Zahl besteht immer aus zwei Teilen: dem Real- und dem Imaginärteil. Der Realteil ist einfach zu erklären: das ist einfach eine ganz normale reelle Zahl. Warum der Imaginärteil so heißt,obwohl doch die Mathematik eher wenig mit Imagination, sondern nur mit harten Fakten arbeitet, ist folgendermaßen zu verstehen : Der I-Teil besteht aus einer "normalen" reellen Zahl, die noch mit der ominösen Konstanten namens i multipliziert ist. Dieses i stellt die Zahl "Wurzel aus -1" dar. Halt,moment! Aus negativen Zahlen darf man doch gar keine Wurzeln ziehen. Nein ? Macht nichts. Wir sagen einfach, es gebe die Zahl i=sqrt(-1). Punkt. Das hat nämlich den Vorteil, daß wir ab sofort aus jeder negativen Zahl die Wurzel ziehen können. Denn : sqrt (a*b) = sqrt (a) * sqrt(b) Also : sqrt (-b) = sqrt (-1 * b) = sqrt(-1) * sqrt(b) So haben wir die Wurzeln ALLER negativer Zahlen auf Wurzeln positiver Zahlen zurückgeführt. sqrt(-192.3478) ist also gleich sqrt(192.3478) * i = 13.869i ! Das i muß man halt beim Rechnen immer mitschleppen, aber das stört ja nicht so arg. Addieren und Subtrahieren ist ganz einfach: R- und I-Teil werden je- weils getrennt addiert bzw. subtrahiert. Multiplikation geht so : (Binomische Formeln lassen grüßen ) (a + bi)*(c + di) = a*c + bi*di + bi*c + a*di = ac - bd + (ad+bc)i Man beachte, daß aus <+bi*di> ein <-bd> geworden ist : i² = -1 ! Undsoweiter. Man stelle sich nun ein Koordinatensystem vor. Jede komplexe Zahl wird hier durch einen Punkt repräsentiert (also anstatt eines Zahlenstrahles gibt es nun eine Zahlenebene). An der x-Achse wird der Realteil, an der y-Achse der Ima- ginärteil abgemessen. ^ Imaginärteil | + + (2+3i) | | + | | 1+ + (1+1*i) | | --------------------+----+----+----+------> | 1 Realteil | (-1-i) + | | | | + (2+2i) | | | Nun kommt endlich Benoit Mandelbrot ins Spiel. Der dachte sich nämlich : Was wäre besser geeignet, ein Koordinatensystem darzustellen, als ein Computerbildschirm. Und er legte den Ursprung des Koordinatensystems in die Mitte des Schirms. Der Ausschnitt, den er betrachtete, reichte von jeweils -2 bis +2 auf jeder Achse. Der Bildschirm des Computers ist in der Lage, verschiedene Punkte durch verschiedene Farben zu unterscheiden. Nach vermutlich langem Rumprobieren kam Mandelbrot auf die Idee, jeden Punkt durch eine ganze Latte von Rechnun- gen zu jagen und die Farbe des Punktes abhängig vom Resultat der Berechnung zu setzen. Die Formel, die beim Apfelmännchen verwendet wird, ist rekursiv und lautet folgendermaßen: z = z² + C Dabei ist z die Funktionsvariable (komplexe Zahl) und C eine beliebige kon- stante komplexe Zahl. Am Anfang der Rechnungen ist z=0. C wird auf den Wert gesetzt, den die Koordinaten des gerade zu berechnenden Punktes tragen. Nun wird z quadriert, C addiert und das ganze wieder in z gespeichert. Dies wird wieder quadriert, wieder wird C addiert undsoweiter, bis eins von zwei Dingen passiert. Für den Verlauf dieser Rechnungen gibt es nämlich sagen wir drei verschiedene Möglichkeiten: 1.) z wächst rasch an und nähert sich mit Riesenschritten der Unendlich- keit. 2.) z wächst und fällt und braucht sehr viele Iterationen = Rechenschrit- te, bis es plötzlich anfängt, wie bei 1.) zu wachsen 3.) z wächst überhaupt gar nicht oder nur sehr sehr sehr wenig Wenn hier von der Größe der Zahl z die Rede ist, ist damit ihr Betrag ge- meint, der sich wie der Betrag eines Vektors errechnet (sqrt(x²+y²)). Die Erfahrung zeigte nun, daß, sobald der Betrag einer Zahl z einmal über 2 angewachsen war, er sich rasch vergrößerte und sich der Unendlichkeit näherte. Man spricht hier vom sogenannten "Zweiergefängnis". Manche Zahlen schaffen es leicht, auszubrechen und werden nie mehr gesehen [ 1.) ]. Manche schaffen es nie [ 3.) ]. Manche, und das sind die interessanten, scheinen eine ganze Weile ziellos herumzuirren, bevor sie schließlich den großen Sprung schaffen [ 2.) ]. Diese Zahlen liegen am Rand des Apfelmännchens, d.h. zwischen dem einfarbig schwarzen und dem einfarbig bunten Bereich. Von weitem betrachtet scheint dieser Rand völlig unordentlich und chaotisch zu sein; je genauer man ihn jedoch betrachtet, desto erstaunlicher werden die Muster und Formen, die man entdecken kann. Deshalb sind die Zahlen der zweiten Gruppe für uns am interessantesten. Das Problem : Woher weiß ich, welche Zahl in welche Gruppe gehört? Antwort : Gar nicht. Man kann nur probieren. Der Computer löst das Problem folgendermaßen: Man setzt ihm eine Schranke von zum Beispiel 50 Iterationen. Nun wird eine Zahl nach der anderen bearbeitet. Schafft sie es, aus dem 2er Gefängnis auszubrechen, wird ein Punkt gesetzt (in der Farbe abhängig von der Anzahl der benötigten Rechen- durchläufe). Hat sie es aber beim 50. Mal noch nicht geschafft, nimmt der Computer an: "Dann schafft sie's gar nicht mehr" und läßt den Punkt leer. Je höher man diese Iterationszahl (auch oft Tiefe genannt) setzt, desto feiner und genauer wird das Bild (vielleicht hätte sie's ja beim 51. Mal geschafft), desto länger muß man jedoch auch darauf warten. Je kleiner die Ausschnitte, die man betrachtet, desto höher muß die Tiefe gesetzt werden, um noch die Feinstrukturen erkennen zu können. So wird also ein Apfelmännchen Punkt für Punkt in mühevoller Kleinarbeit berechnet - eine Aufgabe, die nur für Computer überhaupt möglich ist. Wer Lust hat, Apfelmännchen per Taschenrechner zu berechnen, der solle sich am besten zwei-drei Jahre freinehmen. Übrigens ist es leider nicht möglich, bis in beliebige Tiefen ins Apfel- männchen vorzudringen. Theoretisch ginge das zwar, aber da die Rechen- genauigkeit immer eine Grenze hat, hat auch die Auflösung irgendwann ein Ende. MandelPrint rechnet mit 6 Stellen Genauigkeit. Das sollte für die meisten Zwecke reichen. Wer mehr will, kann gerne das Programm für die mathieeedoubbas.library umschreiben; dann hat er 15 Stellen Genauigkeit. Vielleicht mache ich das sogar noch selber. Das ganze hat aber leider einen ganz großen Nachteil: Die Berechnungen dauern VIEL länger. Welches ist nun das kleinere Übel ? Zwei Sachen noch : Es ist bewiesen, daß alle Punkte, die bei einem Apfel- männchen wegen Überschreitung des Iterationsmaximums leer gelassen werden, in einer zusammenhängenden Fläche enthalten sind. Der Umfang dieser Fläche ist unendlich groß, da er unendlich fein verästelt ist( siehe unser Eingangs- beispiel mit der Länge der englischen (britischen) Küste). Der Flächeninhalt dieser Fläche ist mit leider nicht bekannt; fest steht zwar, daß er endlich ist, ich bezweifle aber, daß ihn schon jemand ausgerechnet hat. Wenn doch, wäre ich dankbar, wenn mir ihn jemand mitteilte. Als zweites kann ich noch das Sonderheft "Computer-Kurzweil Nr.1" oder das Heft vom Oktober 1985 (beide aus der Reihe "Spektrum der Wissenschaft") empfehlen. Dort ist auch eine relativ kurze, gut verständliche Erklärung zur Mandelbrot-Menge abgedruckt. TECH INFO Zwei Dinge hätten es verdient, erwähnt zu werden. Erstens: Wie kann ich die HELP-Taste abfragen, wo doch das System mittels Forbid lahmgelegt wurde ? Forbid schaltet nur das Multitasking aus, nicht aber die Inter- rupts. Das input.device ist also zu, aber der Tastaturinterrupt kommt noch, und den kann ich prima auslesen und zwar im Register $BFEC01. Dort ist der Tastencode der momentan gedrückten Taste gespeichert. Leider ist dieser Weg nicht gerade der eleganteste, da es durchaus möglich wäre, daß diese Adresse sich in Zukunft vielleicht verschiebt. Wenn also das Programm unter Kickstart 15.340 nicht laufen sollte, dann müßte man mal diese Adresse überprüfen. Zweitens: Wie wird die Graphik zum Drucker geschickt ? Jeder Graphikpunkt belegt 4 (2 auf 2) Druckpixel. Die echte Auflösung beträgt also nur 180*180 DPSQI. Je 3 Bytes hintereinander ergeben eine Punktspalte von 24 Punkten von oben nach unten gelesen. 6 Bytes enthalten also die Werte für 12 fertige Punkte. Nach jeder Zeile wird ein Zeilenvorschub ausge- führt und der Graphikdruck auf höchste Dichte eingestellt. Dieses Druckerkommando, das die Druckergraphik einschaltet, kann bei anderen Druckern verschieden sein und muß folglich in der Zeile das dort stehende Kommando ersetzen. So müßte sich MandelPrint an alle anderen 24-Nadler anpassen lassen, vorausgesetzt, der Graphikaufbau (immer 3 Bytes für 1 Zeile) ist identisch zu dem des NEC P6. Hoffentlich. SONSTIGES Entwickelt wurde dieses Programm auf dem DEVPAC-Assembler von HiSoft, der mir diese Arbeit zu einem richtigen Vergnügen gemacht hat. Gelobt sei der Debugger MonAm, ohne den dieses Programm niemals fertig geworden wäre. Ich habe MandelPrint auf einem Amiga 2000 getestet, wüßte aber nicht, warum es auf den anderen Modellen nicht laufen sollte. Hoffentlich macht dieses Programm jemandem Spaß ! T.Pietzcker