Cheatah: Mathematik: Fraktale

Hi allerseits,

das Thema "Meinung" stimmt nicht so ganz, aber "Erfolgsmeldung" gab's leider nicht :-)

Aus einer Laune heraus habe ich ein kleines Progrämmchen entwickelt, das ich schon immer mal machen wollte. Damit kann man on the fly beliebige Mandelbrotmengen berechnen lassen, und zwar nicht nur mit Parameterübergabe, sondern auch durch Anklicken der linken oberen und rechten unteren Ecke eines neuen Bereichs. Zu finden hier: http://cheatah.net/cgi-bin/makefrac.pl

Die Bedienung ist einfach, wenn man festgestellt hat, daß man auf die Grafik auch klicken kann *g* Der Button "Berechnen" ist für den Fall, daß man Rahmenparameter wie z.B. Breite und Höhe der Grafik geändert hat, den Ausschnitt selbst aber nicht verändern will. Vielleicht nützt es ja jemandem :-)

Ich habe noch vor, einige zusätzliche Optionen einzubauen, z.B. herauszoomen, Skala/Koordinatensystem in der Grafik, andere Farbpaletten, evtl. sogar Juliamengen... Vorschläge sind willkommen!

So, das wollte ich nur loswerden :-)

Cheatah

  1. Aus einer Laune heraus habe ich ein kleines Progrämmchen entwickelt, das ich schon immer mal machen wollte. Damit kann man on the fly beliebige Mandelbrotmengen berechnen lassen,

    ...

    So, das wollte ich nur loswerden :-)

    Sieht klasse aus.
    Leider bin ich immer viel zu faul solche Dinge zu machen. Was ich aber viel interessanter faende, waere ein Programm zu Splines, dass mir nette kleine Kurven zu bestimmten Bewegungspunkten berechnet. Es ist doch muessig immer mit Koordinaten rumzuspielen. Ich habs bisher einmal gemacht, aber eben nichts allgemein verwendbares.

    Waer das nicht was fuer Dich zum Spielen :-)

    Viele Gruesse, Thomas Hieck

    1. Hi Thomas,

      Sieht klasse aus.

      danke :-)

      Leider bin ich immer viel zu faul solche Dinge zu machen. Was ich aber viel interessanter faende, waere ein Programm zu Splines, dass mir nette kleine Kurven zu bestimmten Bewegungspunkten berechnet. Es ist doch muessig immer mit Koordinaten rumzuspielen. Ich habs bisher einmal gemacht, aber eben nichts allgemein verwendbares.

      Waer das nicht was fuer Dich zum Spielen :-)

      Klar... wenn ich wüßte, was Du meinst?! Was für Kurven und Bewegungspunkte meinst Du? Was ist/sind "Splines"? Vielleicht stehe ich ja nur auf dem Schlauch... :-)

      Cheatah

      1. Klar... wenn ich wüßte, was Du meinst?! Was für Kurven und Bewegungspunkte meinst Du? Was ist/sind "Splines"? Vielleicht stehe ich ja nur auf dem Schlauch... :-)

        Interpolation von Punkten. Nicht indem man nicht einfach nur Linien von einem zum anderen Punkt zieht, sondern mit einer minimalen Kruemmung die Punkte verbindet - also wunderschoene weiche Kurven durch diese Punkte zeichnet und die Funktion dafuer errechnet. (ums mal ganz unmathematisch auszudruecken)

        Viele Gruesse, Thomas Hieck

        1. Hi,

          Klar... wenn ich wüßte, was Du meinst?! Was für Kurven und Bewegungspunkte meinst Du? Was ist/sind "Splines"? Vielleicht stehe ich ja nur auf dem Schlauch... :-)

          Interpolation von Punkten. Nicht indem man nicht einfach nur Linien von einem zum anderen Punkt zieht, sondern mit einer minimalen Kruemmung die Punkte verbindet - also wunderschoene weiche Kurven durch diese Punkte zeichnet und die Funktion dafuer errechnet. (ums mal ganz unmathematisch auszudruecken)

          ach so, so was dachte ich mir schon... Naja, ist ja jetzt ein bißchen themenfremd, und ein komplettes Mathematikprogramm wollte ich eigentlich nicht entwickeln :-)

          Cheatah

  2. Hallo Cheatah

    erzeugt das Script den GIF-Code dynamisch anhand der berechneten Strukturen?
    Wenn ja, hast du dich ja mittlerweile ganz schoen tief reingekniet in das GIF-Format <g>.

    Solltest du mal dokumentieren und unter die Leute bringen, ich glaube, bei den Dingen, die man heute so fuer ein Abi braucht (siehe http://www.teamone.de/selfaktuell/self_forum/16875.html;-) sind Lehrer und Schueler sicher ganz wild da drauf. Bei http://www.cgi-resources.com hab ich jedenfalls nix Vergleichbares gefunden, und wenn es wirklich nix dergleichen gibt, koennte das Ding ein richtiger Hit werden.

    viele Gruesse
      Stefan Muenz

    1. Hi,

      erzeugt das Script den GIF-Code dynamisch anhand der berechneten Strukturen?
      Wenn ja, hast du dich ja mittlerweile ganz schoen tief reingekniet in das GIF-Format <g>.

      Fein, fein. Hab' ja wirklich ne ganze weile nichts von Deinen Gif-Versuchen gelesen.
      Wirkt ja so, als wenn Du Dich inzwischen zugegifft hättest ;-).

      Mit den Apfelmännchen habe ich mich auch schon mal intesivst auseinandergesetzt. Das
      ging dann später so in richtung 3D (Gebirge) oder Projektion der auf eine Kugel ...
      Kann man ganz schön viel Zeit dran loswerden :-)

      Viel Spaß noch,
         Jörk

      1. Hi Jörk,

        Fein, fein. Hab' ja wirklich ne ganze weile nichts von Deinen Gif-Versuchen gelesen.
        Wirkt ja so, als wenn Du Dich inzwischen zugegifft hättest ;-).

        ich habe das Modul GD.pm gefunden, das mir das Verständnis abnimmt ;-)
        Mein größtes Problem mit dem Ding ist, daß es keine Animationen beherrscht...

        Mit den Apfelmännchen habe ich mich auch schon mal intesivst auseinandergesetzt. Das
        ging dann später so in richtung 3D (Gebirge) oder Projektion der auf eine Kugel ...
        Kann man ganz schön viel Zeit dran loswerden :-)

        Oh ja, das habe ich auch mal gemacht... mit Turbo Pascal! Damals habe ich verschiedene Versionen 3-dimensionaler Darstellung in ein Script integriert, inkl. solcher Farbversionen, daß tatsächliche Berge entstehen (Mandelbrotmenge ist blau, dann folgt ein gaaanz kurzer Streifen gelb/orange, dann grün, dann braun/grau, und ganz oben sind die Berggipfel schneeweiß) :-) Dazu kamen Sinusverzerrungen in beide Richtungen und all solcher Schnickschnack. Ich werde mal sehen, daß ich so eine Darstellung auch hinbekomme!

        Cheatah

        1. Hi Jörk,

          Fein, fein. Hab' ja wirklich ne ganze weile nichts von Deinen Gif-Versuchen gelesen.
          Wirkt ja so, als wenn Du Dich inzwischen zugegifft hättest ;-).

          ich habe das Modul GD.pm gefunden, das mir das Verständnis abnimmt ;-)
          Mein größtes Problem mit dem Ding ist, daß es keine Animationen beherrscht...

          Men Tip wäre da mal Einfach die 10 Einzelbilder zu erstellen, und die dann per JS zu animieren.

          Was ist eigendlich so besonders an diesen Bildern? Ich hab schon ein paar Programme dafür gesehen, verstehe aber den Zweck nicht.

          1. Hi,

            ich habe das Modul GD.pm gefunden, das mir das Verständnis abnimmt ;-)
            Mein größtes Problem mit dem Ding ist, daß es keine Animationen beherrscht...

            Men Tip wäre da mal Einfach die 10 Einzelbilder zu erstellen, und die dann per JS zu animieren.

            Was ist eigendlich so besonders an diesen Bildern? Ich hab schon ein paar Programme dafür gesehen, verstehe aber den Zweck nicht.

            eine Animation ist für eine Grafik ungefähr das gleiche, wie Fernsehen für ein Foto. Oder was meinst Du?

            Zumindest ist eine JS-Lösung absolut unnötig und bereitet weit mehr Probleme, als es hilft, solange die Browser Animationen verarbeiten können.

            Cheatah

    2. Hi Stefan,

      erzeugt das Script den GIF-Code dynamisch anhand der berechneten Strukturen?
      Wenn ja, hast du dich ja mittlerweile ganz schoen tief reingekniet in das GIF-Format <g>.

      leider habe ich das mit dem Grafikformat irgendwann aufgegeben, statt dessen benutze ich das Modul GD.pm - das macht all solche Dinge automatisch ;-)
      Irgendwann werde ich darüber ein Special verfassen, aber derzeit habe ich noch ein paar Probleme mit den einzelnen Funktionen sowie der lokalen Installation. Wenn ich die gelöst habe, verfasse ich einen Bericht!

      Solltest du mal dokumentieren und unter die Leute bringen, ich glaube, bei den Dingen, die man heute so fuer ein Abi braucht (siehe http://www.teamone.de/selfaktuell/self_forum/16875.html;-) sind Lehrer und Schueler sicher ganz wild da drauf.

      Lese ich noch :-)

      Bei http://www.cgi-resources.com hab ich jedenfalls nix Vergleichbares gefunden, und wenn es wirklich nix dergleichen gibt, koennte das Ding ein richtiger Hit werden.

      Nun ja, auf der Suche nach der Berechnungsformel (bzw. nach optimierten Algorithmen) habe ich ein paar Applets gefunden, die das life erledigen. Das tolle ist aber, daß es nur zwei kleine Scripts mit je 3 KByte sind, also praktisch gar kein Code! Die Scripts sind während der Optimierungszeit noch ein wenig im "Quick-Hack-Modus", sehen also grausam aus *g* wenn das abgestellt ist (und ich ein paar Kommentare zugefügt habe), poste ich sie aber mal!

      Cheatah

  3. Hi Cheatah,

    ein wirklich nettes CGI. Fraktale haben mich schon immer fasziniert. Beim Rumspielen mit Deinem Programm ist mir nur aufgefallen, daß nach einigen "Zooms" das Seitenverhältnis des neuen Ausschnitts nicht mehr stimmt und das Bild dann verzerrt aussieht. Dann wäre ein Button "Großes Bild berechnen" (o.ä.) noch schön, d.h. wenn einem das kleine Bildchen gefällt, daß man es sich dann auch als großes Bild berechnen lassen kann.

    Gruß,
    Stefan

    1. Hi Stefan,

      ein wirklich nettes CGI. Fraktale haben mich schon immer fasziniert. Beim Rumspielen mit Deinem Programm ist mir nur aufgefallen, daß nach einigen "Zooms" das Seitenverhältnis des neuen Ausschnitts nicht mehr stimmt und das Bild dann verzerrt aussieht. Dann wäre ein Button "Großes Bild berechnen" (o.ä.) noch schön, d.h. wenn einem das kleine Bildchen gefällt, daß man es sich dann auch als großes Bild berechnen lassen kann.

      Du kannst zu einem beliebigen Zeitpunkt Deine eigene Größe eingeben :-)

      Die Idee an sich ist gut, ich merke es mir gleich mal. Ich sehe nur ein paar Probleme dabei:

      • Welches ist eigentlich das "normale" Verhältnis?
      • Welche Seite nehme ich als Berechnungsgrundlage?
      • Verändere ich den sichtbaren Ausschnitt, oder lieber die dargestellte Größe?

      Zugegebenermaßen läßt sich das alles lösen, aber solche Überlegungen muß man halt anstellen :-)

      Danke für den Vorschlag,

      Cheatah

  4. Hi again,

    das Script wurde um ein paar Funktiönchen erweitert. Man kann jetzt (aktiviertes JavaScript vorausgesetzt) einen 25% größeren Rahmen in jeder beliebigen Richtung anwählen (führt ein bißchen zu schiefen Darstellungen, wenn man in zwei entgegengesetzte Richtungen erweitert - 25% sind halt nicht gleich 25%). Vor allem hat man aber jetzt die Auswahl zwischen einigen Farbpaletten (die Zahl der Farben steht jeweils in Klammern), weitere werden folgen. Der Punkt "Ausgabetyp" ist für später, wenn man auch dreidimensional darstellen lassen kann ;-)

    Comments sind wie immer very welcome! Zur Erinnerung noch mal der Link:

    http://cheatah.net/cgi-bin/makefrac.pl

    Cheatah

    1. Hi die nächste :-)

      http://cheatah.net/cgi-bin/makefrac.pl

      Jetzt möchte ich einfach mal ein paar Koordinaten loswerden:

      -0.57279415669487 / -0.559131958703877
      -0.572617057479262 / -0.558933813572447
      1000 Iterationen
      in 250 Graustufen.

      Ein schönes Beispiel dafür, daß die Wahl der Farbpalette wichtig ist :-)

      Cheatah

  5. Hallo Cheatah !

    Das Programm gefällt mir wirklich sehr gut; macht richtig Spaß mal ein paar Sachen auszuprobieren :-)
    Ich habe mich zwar nie richtig mit dem Sinn und Zweck von Fraktalen beschäftigt, außer damals mal kurz im Physik-LK, da war mal was mit der Chaos-Theorie, falls ich das noch richtig im Kopf habe ?!

    Damals hatte ich auf meinem 486 ein kleines DOS Programm, ich glaube das hieß fractint oder so ??? Damit konnte man alle möglichen Formen berechen und umformen, und was weiß ich noch alles damit anstellen (richtig schön um sich auszutoben). Es gab sogar ein paar vorgegeben Koordinaten, die man nur noch berechnen mußte ... hab ich gerne gemacht, eins davon hieß Kermit und sah wirklich fast wie ein Frosch aus (roter Hintergrund mit grünem Kopf), der große Nachteil: die Berechnung hatte ca. 8 Stunden gedauert :-(  (486-25 mit 4MB ...).

    Ich müßte das noch irgendwo auf einer alten Disk haben, werde es mir heute abend wohl noch mal auf die Platte spielen :-) Aber deine Umsetzung ist wirklich super geworden !
    Nochmals alle Hochachtung !

    Frank

    P.S.: Bin auch die Erweiterungen, sowie den Code gespannt :-)

    1. Hi,

      Das Programm gefällt mir wirklich sehr gut; macht richtig Spaß mal ein paar Sachen auszuprobieren :-)

      freut mich :-)

      Ich habe mich zwar nie richtig mit dem Sinn und Zweck von Fraktalen beschäftigt, außer damals mal kurz im Physik-LK, da war mal was mit der Chaos-Theorie, falls ich das noch richtig im Kopf habe ?!

      Ja, Chaos und Fraktale sind eng miteinander verknüpft. Was ich verarbeitet habe ist die sog. Mandelbrotmenge ("Apfelmännchen"), benannt nach Benoit Mandelbrot, der die Formel eigentlich als erstes Fraktal erstellt hat - lange bevor es Computer gab.

      Damals hatte ich auf meinem 486 ein kleines DOS Programm, ich glaube das hieß fractint oder so ??? Damit konnte man alle möglichen Formen berechen und umformen, und was weiß ich noch alles damit anstellen (richtig schön um sich auszutoben). Es gab sogar ein paar vorgegeben Koordinaten, die man nur noch berechnen mußte ... hab ich gerne gemacht, eins davon hieß Kermit und sah wirklich fast wie ein Frosch aus (roter Hintergrund mit grünem Kopf), der große Nachteil: die Berechnung hatte ca. 8 Stunden gedauert :-(  (486-25 mit 4MB ...).

      Ja, Fractint kenne ich, gibt's auch als Windows-Programm.

      Ich müßte das noch irgendwo auf einer alten Disk haben, werde es mir heute abend wohl noch mal auf die Platte spielen :-) Aber deine Umsetzung ist wirklich super geworden !
      Nochmals alle Hochachtung !

      Vielen Dank :-)

      P.S.: Bin auch die Erweiterungen, sowie den Code gespannt :-)

      Die Berechnung ist eigentlich sehr einfach:

      $xstep = ($x2-$x1)/$breite;
      $ystep = ($y2-$y1)/$hoehe;
      $ypos = $y1;
      for ($y=0; $y<$hoehe; $y++) {
         $xpos = $x1;
         $ypos += $ystep;
         for ($x=0; $x<$breite; $x++) {
            $xpos += $xstep;
            $step=0; $zx=0; $zy=0; $decided=0;
            while (++$step <= $tiefe && !$decided) {
               $zx2 = $zx*$zx - $zy*$zy + $xpos;
               $zy = 2*$zx*$zy + $ypos;
               $zx = $zx2;
               $dist = $zx*$zx+$zy*$zy;
               if ($dist > 4) { $decided = 1; }
            }
            if ($decided) { print &setpixel($x,$y,($step-1)%$noc); }
         }
      }

      Davor und danach sind noch ein paar andere Dinge (&setpixel setzt nur einen Pixel in der entsprechenden Farbe, $noc ist "NumberOfColors"), aber dies ist die grundlegende, noch kaum optimierte Formel. Wenn ich den Code optimiert habe, werde ich ihn komplett posten!

      Cheatah

      1. Hi Cheatah!

        In den tiefen der Doku von 'Fractint' findet sich übrigens noch ein sehr interessanter Hinweis: Bei der Berechnung "stören" ja vor allem die "schwarzen" Bereiche der Mandelbrot-Menge, weil dort der Betrag der komplexen Zahl nie >2 wird, man dort also die Iterationen in ihrer kompletten Länge durchackern muß - für nix ;-) Bei Fractint haben die Programmierer ausgenutzt, daß sich im schwarzen Bereich oft 'Orbits' finden (darauf muß man auch erstmal kommen...), d.h. im Laufe der Iteration landet man z.B. nach 3 Schritten wieder an der selben Stelle - eine Art Endlosschleife sozusagen. Weil Fractint diese 'Orbits' aufspürt, rechnet das Programm an diesen Stellen so auffällig schnell... Fand ich nur mal ganz interessant - vielleicht reizt es Dich ja, das auch mal näher zu untersuchen ;-))

        Viele Grüße

        Andreas Bierhals

        1. Hi Andreas,

          In den tiefen der Doku von 'Fractint' findet sich übrigens noch ein sehr interessanter Hinweis: Bei der Berechnung "stören" ja vor allem die "schwarzen" Bereiche der Mandelbrot-Menge, weil dort der Betrag der komplexen Zahl nie >2 wird, man dort also die Iterationen in ihrer kompletten Länge durchackern muß - für nix ;-) Bei Fractint haben die Programmierer ausgenutzt, daß sich im schwarzen Bereich oft 'Orbits' finden (darauf muß man auch erstmal kommen...), d.h. im Laufe der Iteration landet man z.B. nach 3 Schritten wieder an der selben Stelle - eine Art Endlosschleife sozusagen. Weil Fractint diese 'Orbits' aufspürt, rechnet das Programm an diesen Stellen so auffällig schnell... Fand ich nur mal ganz interessant - vielleicht reizt es Dich ja, das auch mal näher zu untersuchen ;-))

          danke für den Hinweis, aber das ist mir bekannt :-) nur weiß ich nicht, wie ich das effizient einprogrammieren soll. Das meinte ich aber u.a. auch mit "praktisch nicht optimiert"... ich habe gerade mal für die Entfernungsberechnung "sqrt(x)>2" durch "x>4" ersetzt ;-)

          Wenn Du weitere Optimierungsmethoden kennst (oder vielleicht sogar einen vernünftigen Algorithmus für die Orbitale findest), wäre ich Dir dankbar für eine Mitteilung!

          Cheatah

          1. Hi Cheatah!

            Wenn Du weitere Optimierungsmethoden kennst (oder vielleicht sogar einen vernünftigen Algorithmus für die Orbitale findest), wäre ich Dir dankbar für eine Mitteilung!

            genaueres weiß ich leider auch nicht, ich könnte mir aber vorstellen, daß es mit Hash-Tabellen funktioniert. Es geht ja darum, herauszubekommen, ob die gerade berechnete komplexe Zahl aus Iteration N schon vorher (Iterationen 1, 2, ... N-1) vorkam. Wenn man es schafft, sich eine Hashfunktion auszudenken, die die komplexen Zahlen in irgendeine Hashtabelle einsortiert und dazu möglichst keine zusätzliche Rechenzeit verbraucht, müßte man dann immer nur die Zahlen vergleichen, die in den selben "Zellen" der Hash-Tabelle lagern. Vielleicht kann man ja schon das Betragsquadrat, welches ja sowieso immer berechnet wird, für solch eine Hashfunktion "mißbrauchen"?!
            Wahrscheinlich gibt es da aber noch viele Tücken (z.B. Rundungsfehler), die man so nicht absehen kann ;-) Würde mich aber auch mal interessieren, wie sowas funktioniert...

            Viele Grüße

            Andreas

            1. Hi Andreas,

              Würde mich aber auch mal interessieren, wie sowas funktioniert...

              dann sind wir schon zwei :-)
              Über Deinen Vorschlag mit Hashs müßte ich noch mal nachdenken, vermutlich sind aber Arrays (oder zweifach verkettete Listen, ähem...) besser geeignet. Oder eine Kombination aus beidem, frei nach dem Motto: Im Hash speichern wir alle Werte, die als Fluchtzahlen bzw. Zyklen erkannt wurden, im Array die jeweils letzten Werte, um Zyklen zu erkennen. Ich glaube aber nicht, daß der Algorithmus damit wesentlich schneller wird... :-/

              Cheatah

              1. Hallo nochmal... bevor der Thread im Archiv verschwindet <g>

                ... geeignet. Oder eine Kombination aus beidem, frei nach dem Motto: Im Hash speichern wir alle Werte, die als Fluchtzahlen bzw. Zyklen erkannt wurden, im Array die jeweils letzten Werte, um Zyklen zu erkennen. Ich glaube aber nicht, daß der Algorithmus damit wesentlich schneller wird... :-/

                ...wozu willst Du denn ganze Zyklen erkennen (lassen)? Imho reicht es doch schon aus, wenn nur *eine* Zahl aus der bisherigen Reihe der Iterationen ein zweites mal vorkommt. Weiter reicht das 'Gedächtnis' der Formel  "z_(n+1) := z_(n)^2 + z_0"  ja nicht zurück. Du könntest die Zahlen z.B. in ein Hash mit 1000 Zellen einsortieren. Wenn dabei in einer Zelle 2 Zahlen landen und diese sich dann auch noch exakt gleichen, ist die Sache doch schon geritzt, oder?

                Viele Grüße

                Andreas

                1. Hi,

                  Hallo nochmal... bevor der Thread im Archiv verschwindet <g>

                  :-)

                  ...wozu willst Du denn ganze Zyklen erkennen (lassen)? Imho reicht es doch schon aus, wenn nur *eine* Zahl aus der bisherigen Reihe der Iterationen ein zweites mal vorkommt. Weiter reicht das 'Gedächtnis' der Formel  "z_(n+1) := z_(n)^2 + z_0"  ja nicht zurück. Du könntest die Zahlen z.B. in ein Hash mit 1000 Zellen einsortieren. Wenn dabei in einer Zelle 2 Zahlen landen und diese sich dann auch noch exakt gleichen, ist die Sache doch schon geritzt, oder?

                  Nun ja, nur wie soll ich das realisieren? Wenn ich einen Wert finde, der noch nicht im Hash steht, weiß ich ja nicht, zu was er führt. Soll ich ihn also abspeichern oder nicht? Das Hash sollte jedenfalls nicht nur in dieser Berechnung zur Verfügung stehen, später wird es ja auch noch gültig sein (oder?)

                  Ach herrje, ich glaube, ich muß da noch mal gründlich drüber nachdenken... *seufz* Optimierungen... (hach ja)

                  Cheatah