Was zum Spielen!


  • Mod

    Da:

    Lyapunov.java:

    import java.awt.image.BufferedImage;
    
    import javax.swing.JFrame;
    
    public class Lyapunov
    {
    
       public static void main(String[] args)
       {
          final boolean [] sequence = {true,true,false,true,false};
          final int iterations = 200;
          final int width = 700;
          final int height = 700;
          final double initValue = 0.5;
          final double startX = 2.5;
          final double startY = 2.5;
          final double endX = 4.0;
          final double endY = 4.0;
    
          final double [][] diagram = createDiagram (width,height,startX,startY,endX,
                                                     endY,initValue,sequence,
                                                     iterations);
          BufferedImage image = createDiagramImage(diagram);
          ImageComponent imageComponent = new ImageComponent (image);
          JFrame frame = new JFrame ("Lyapunov");
          frame.getContentPane().add(imageComponent);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.pack();
          frame.setVisible(true);
       }
    
       private static double [][] createDiagram (int width, int height, 
                                                 double startX, double startY, 
                                                 double endX, double endY, 
                                                 double startValue, boolean [] sequence, 
                                                 int iterations)
       {
          final double [][] diagram = new double [width][height];
          final double lnTwo = Math.log(2.0);
          final int seqLength = sequence.length;
          for (int x = 0 ; x < width ; ++x)
          {
             final double xValue = getXValue (x,width,startX,endX);
             for (int y = 0 ; y < height ; ++y)
             {
                final double yValue = getYValue (y,height,startY,endY);
                double currentValue = startValue;
                double total = 0.0f;
                for (int iter = 0 ; iter < iterations ; ++iter)
                {
                   for (int seqIndex = 0 ; seqIndex < seqLength ; ++seqIndex)
                   {
                      if (sequence[seqIndex])
                      {
                         currentValue = getNextValue (currentValue, xValue);
                         total += Math.log(Math.abs(xValue - 2.0f * xValue * 
                                                    currentValue)) / lnTwo;
                      }
                      else
                      {
                         currentValue = getNextValue (currentValue, yValue);
                         total += Math.log(Math.abs(yValue - 2.0f * yValue * 
                                                    currentValue)) / lnTwo;
                      }
                   }
                }
                total /= (double)iterations;
                diagram[x][y]=total;
             }
             System.out.print (x);
             System.out.print (" / ");
             System.out.println (width);
          }
    
          return diagram;
       }
    
       private static BufferedImage createDiagramImage (double [][] diagram)
       {
          int width = diagram.length;
          int height = diagram[0].length;
          BufferedImage image = new BufferedImage (width,height,BufferedImage.TYPE_INT_RGB);
          double minValue = Float.MAX_VALUE;
          double maxValue = Float.MIN_VALUE;
          for (int x = 0 ; x < width ; ++x)
          {
             for (int y = 0 ; y < height ; ++y)
             {
                if (diagram[x][y] < minValue) minValue = diagram [x][y];
                if (diagram[x][y] > maxValue) maxValue = diagram [x][y];
             }
          }
          minValue = Math.log(Math.abs(minValue));
          maxValue = Math.log(maxValue);
          System.out.println(minValue);
          System.out.println(maxValue);
          for (int x = 0 ; x < width ; ++x)
          {
             for (int y = 0 ; y < height ; ++y)
             {
                int color = 0;
                double value = diagram [x][y];
                if (value < -1.0f)
                {
                   value = (float)Math.log(Math.abs(value));
                   int red = 255- (int)Math.round(255.0f * (value / minValue));
                   color = 0x0000ff00 | (red << 16);
                }
                else if (value > 1.0f)
                {
                   value = (float)Math.log(value);
                   int red = (int) Math.round(255.0f * (value / maxValue));
                   color = 0x000000ff | (red << 16);
                }
                else if (color < 0.0f)
                {
                   int green = (int) Math.round(value * -255.0f);
                   color = (green << 8) | 0x00ff0000;
                }
                else
                {
                   int blue = (int) Math.round(value * 255.0f);
                   int red = 255 - blue;
                   color = (red << 16) | blue;
                }
                image.setRGB(x,y,color);
             }
          }
    
          return image;
       }
    
       private static double getNextValue (final double oldValue, final double compValue)
       {
          return compValue * oldValue * (1.0f - oldValue);
       }
    
       private static double getXValue (final int x, final int width, 
                                        final double startX, final double endX)
       {
          final double relativeX = (double)x / (double) width;
          return relativeX * (endX-startX) + startX;
       }
    
       private static double getYValue (final int y, final int height, 
                                        final double startY, final double endY)
       {
          final double relativeY = (double)y / (double) height;
          return relativeY * (endY-startY) + startY;
       }
    }
    

    ImageComponent.java:

    import java.awt.*;
    import javax.swing.JComponent;
    
    public class ImageComponent extends JComponent
    {
       private Image image;
    
       public ImageComponent (Image image)
       {
          this.image = image;
          setPreferredSize (new Dimension (image.getWidth(null),
                                           image.getHeight(null)));
       }
    
       public void paintComponent (Graphics g)
       {
          g.drawImage(image,0,0,null);
       }
    }
    

    Das ist ein Programm, was ganz hübsche Bilder generieren kann. Wenn ich alles richtig gemacht habe (unwahrscheinlich), dann handelt es sich um Lyapunov-Diagramme.

    Wie kann man damit spielen?

    Man kann sehr unterschiedliche Bilder erzeugen, wenn man die Startwerte verändert. Diese werden am Anfang der main-Methode gesetzt. Vor allem bewirkt eine Änderung der boolschen Sequenz etwas. Natürlich kann man sich auch einen anderen Ausschnitt wählen (mit startX, startY, endX, endY).

    Viel Spaß mit dem Programm! 🙂 Wenn ihr ne Einstellung für ein gutes Bild findet, dann könnt ihr sie ja posten. Ich bin schon gespannt! 🙂

    PS: Das Generieren der Bilder dauert ziemlich lange (mehrere Minuten). In der Konsole wird angezeigt, wie weit man schon ist. Wenn es zu lange dauert, dann kann man die Breite und Höhe des Bildes verringern und die Anzahl der Iterationen verringern.



  • Kann man damit auch Titten rendern??? 🕶 🕶 🕶


  • Mod

    Wer ein Bild mit folgenden Einstellungen haben möchte und seinen Rechner nicht wie ich 15 Stunden rechnen lassen möchte, der kann ja hier seine E-Mail-Adresse posten. Die png-Datei ist allerdings 7,5MB groß, das Postfach muss also eine entsprechende Größe haben.
    [java]
    final boolean [] sequence = {true,true,true,true,true,true,
    false,false,false,false,false,false};
    final int iterations = 1000;
    final int width = 3000;
    final int height = 3000;
    final double initValue = 0.5;
    final double startX = 3.82;
    final double startY = 3.82;
    final double endX = 3.86;
    final double endY = 3.86;[/code]



  • Ich würds gern ma sehen aber die originalgröße muss es net haben 🙂


  • Mod

    OK! Du hast Post. Ich habe das Bild etwas kleiner gemacht. Jetzt ist die Größe IMHO nur noch hart an der Schmerzgrenze, anstatt diese deutlich zu übertreffen! 🙂



  • Danke!
    Sieht wirklich nett aus. Meine Frau meinte sie könne sich gut Vorstellen diese Ljapunovschen Diagramme im Haus aufzuhängen. Wenn man da diverse Parameter hätte die unterschiedliche Ergebnisse liefern würde ich glatt auf die Idee kommen meinen Rechner mehrere Tage rechnen zu lassen um ein 6000pixel breites Bild zu bekommen. Das würde ich dann via PrintService "entwickeln" lassen ... dann häng ich mir das an die Wand 🙂



  • Wie funktioniert das Erzeugen von Lyapunov-Diagrammen? Ich hör davon heute ehrlich gesagt zum ersten Mal, vorher kannte ich nur Mandelbrot und Julia. Aber scheint auch nicht so bekannt zu sein, bei google jedenfalls kann ich kein vernünftiges Dokument finden, das erklärt wie sich Lyapunov-Diagramme berechnen. Gregor, hast du, oder irgendjemand anderes, ein gutes Dokument darüber (vorzugsweise auf Deutsch)?

    [ Dieser Beitrag wurde am 26.04.2003 um 19:53 Uhr von jantoware editiert. ]


  • Mod

    Ich habe im Netz auch kein gutes Dokument darüber gefunden. Ich habe mir das aus mehreren Dokumenten mehr oder weniger zusammengereimt. Ich weiß jetzt aber leider keine Internetadresse mehr.

    Ich weiß aber, dass es in einer sehr alten "Spektrum der Mathematik" einen ausführlichen Artikel darüber gibt, weil ich das mal, als ich noch zur Schule ging, mit Hilfe dieses Artikels programmiert habe. Leider habe ich diesen Artikel auch nicht mehr. Er enthielt aber auch weitere Funktionen, die es sich lohnt, auf diese Weise zu betrachten. Damit entstehen dann ganz andere Bilder. Vielleicht gibt es hier ja wen, der ganz viele "Spektrum der Mathematik" zu Hause hat, den Artikel findet und ihn hier postet bzw. einscant und online stellt. Ich wäre an diesem Artikel zumindest sehr interessiert.



  • Habe es mit javac erfolgreich compiliert.
    Dann habe ich es in eine html-Datei so eingebunden(ist im gleichem Verzeichnis, wie die class-Dateien):

    <applet width="400" height="400" code="Lyapunov.class" align="left">
    

    Java-Konsole spuckt dann folg. Felhlermeldungen aus 😞 :

    java.lang.ClassCastException

    at sun.applet.AppletPanel.createApplet(Unknown Source)
    at sun.plugin.AppletViewer.createApplet(Unknown Source)
    at sun.applet.AppletPanel.runLoader(Unknown Source)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    Was habe ich falsch gemacht ?



  • Es ist kein Applet ... du musst das über die JVM direkt starten.



  • Oh..danke.
    Kannst Du mir auch noch sagen, wie ich das mache.
    In meinen bin-Verzeichnis ist keine jvm.exe oder ist das ein anderes Programm ?
    Wenn ja, wo bekomme ich das Programm her ? (Sorry, ich habe bisher nur einfache Java-Programme mit java.exe ausgeführt)



  • In deinem bin-Verzeichnis ist es die "java.exe" 🙂



  • Thx.
    Oh shit - ich bin ein Sebbel.
    Ich habe mich so auf die Applets versteift, dass ich die java.exe ganz vergessen habe....


Anmelden zum Antworten