Matthias: Julia-Mengen-Programm funzt nich

Also ich hab hier ein Programm geschrieben, das eigentlich Julia-Mengen ausgeben soll:

import java.awt.*;
import java.awt.event.*;

class JuliaMengen extends Frame {
  public JuliaMengen() {
    setTitle("JuliaMengen");
  }

public static void main (String[] args) {

Frame f= new JuliaMengen();
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    f.setSize (1000, 780);
    f.setVisible(true);
  }

public void paint (Graphics g) {
    int a = 254;
    int b = 130;
    double z;
    double n;
    double xa;
    double xb;
    int i;
    while(true)
      {
      if(a==754) {
      a = 254;
      b++;
      }
      if(b==631){
        break;
      }
      a++;
      xa = (a-504)/125;
      xb = (380-b)/125;
      i = 0;

while(i<=10) {
      z = xa*xa-xb*xb;
      xb = 2*xa*xb;
      xa = z;
      i++;
      }
      n = Math.sqrt(xa*xa+xb*xb);
      if(n<=2) {
      g.setColor (Color.black);
      g.drawLine (a,b,a,b);
      }
    }
  }
}

Zunächst werden hier die Pixel umgerechnet in Koordinaten:

xa1 = (a-504)/125;
      xb1 = (380-b)/125;

Es handelt sich um ein Koordinatensystem mit reeller x-Achse und komplexer y-Achse. (Darum gehts ja bei den Julia-Mengen)
Nun werden halt die Pixel in Koordinaten umgerechnet und die jeweilige komplexe Zahl (xa+xb*i) iteriert:

while(i<=10) {
      z = xa*xa-xb*xb;
      xb = 2*xa*xb;
      xa = z;
      i++;
      }

Wie man komplexe Zahlen halt quadriert.
Wenn jetzt die Zahl nach mehreren Quadrierungen immernoch von Koordinatenursprung einen Abstand von weniger als 2 hat:

n = Math.sqrt(xa*xa+xb*xb);
      if(n<=2) {
      g.setColor (Color.black);
      g.drawLine (a,b,a,b);
      }

Dann wird der Punkt an die jeweilige Stelle als Pixel gesetzt. Eigentlich müsste in diesem einfachen Fall ein Kreis rauskommen. Aber dieses dumme Programm gibt mir immer so ein komisches zwölfeck aus, das dem roten Kreuz nicht unähnlich ist (nur halt eben schwarz). Ich weiss nicht, was ich falsch gemacht habe, ob es sich hier um einen fatalen Denkfehler meinerseits handelt oder die Angelegenheit aufgrund einer Eigenschaft meiner Methode überhaupt nicht realisierbar ist. Wenn ihr den Fehler gefunden habt, bitte ich euch, ihn mir möglichst verständlich beizubringen. Ich bin nämlich noch Anfänger.

Danke an alle im Voraus

Matthias

  1. Hallo Matthias,

    meine Versuche mit dem "Apfelmännchen" liegen schon über 10 Jahre zurück, aber wenn ich mich recht erinnere, prüft man doch die Konvergenz einer komplexen Abbildung in Abhängigkeit vom komplexen Startwert. Aufgetragen wird dann die "Divergenzgeschwindigkeit" als Farbe kodiert in der Ebene aufgespannt durch Real-/Imaginärteil des Startwertes.
    Hierfür musst Du in einer verschachteteln Schleife den Real- und den Imaginärwert des Startwertes durchlaufen lassen:

    for(real=rstart;real<rend;real+=rdelta)
     for(imag=istart;imagyiend;imag+=idelta) {
       Gleichung iterieren
       Konvergenz prüfen
       Farbe bestimmen
       real und imag in Grafikkoordinaten umrechnen
       Punkt setzen
    }
    In Deinem Entwurf sehe ich nur eine Schleife, in der a und b hochlaufen. Die Iteration scheint schon in Grafikkoordinaten stattzufinden.
    Aber vieleicht habe ich Dein Programm auch nicht verstanden.

    Gruß, Jürgen

    1. Hallo Jürgen,

      ich habe eigentlich nicht vor, verschiedene Farben zu verwenden (das kann ich ja vielleicht später machen). Es geht mir hier um die Menge an Punkten, die bei Iteration sich nicht dem Unendlichen annähern. Die Mandelbrotmenge ist vom Prinzip her ein bisschen was anderes. In dem Programm sollen nacheinander alle Punkte des Ausschnitts iteriert werden, um zu prüfen, ob sie zur "Gefangenenmenge" oder zur "Fluchtmenge" gehören. Gehört der Punkt zur "Gefangenenmenge", soll er in der Grafik angezeigt werden. Da bei der laufenden Quadrierung einer komplexen Zahl (wie in diesem Fall) sich der Betrag (Abstand vom Koordinatenursprung) auch quadriert, müssten alle komplexen Zahlen mit einem Betrag von <= 1 zur "Gefangenenmenge" oder eben Julia-Menge gehören. Das Problem ist, bei meinem Programm kommt ein Kreuz raus und kein Kreis.

      vg,

      Matthias

      1. Hallo Matthias,

        ich habe eigentlich nicht vor, verschiedene Farben zu verwenden (das kann ich ja vielleicht später machen). Es geht mir hier um die Menge an Punkten, die bei Iteration sich nicht dem Unendlichen annähern.

        d.H. nur zwei Farben, bzw. Punkt oder nicht Punkt.

        ... In dem Programm sollen nacheinander alle Punkte des Ausschnitts iteriert werden, um zu prüfen, ob sie zur "Gefangenenmenge" oder zur "Fluchtmenge" gehören.

        und hierzu benötigst du eine Konstruktion mit zwei geschachteteln Schleifen. Wie das mit Deinem "while" funktionieren soll, habe ich nicht verstanden. Für den Ausschnitt benötigst Du die Real-/Imaginäteile deiner "Punkte des Ausschnitts", nicht deren Bildschirmkoordinaten.

        ...

        Gruß, Jürgen

        1. Hallo Jürgen,

          a und b sind ja bei mir die Bildschirmkoordinaten, und x und y(habs leicht geändert) sind die Koordinaten in der komplexen Ebene, die
          durch das

          x = (a-504)/125;
                y = (380-b)/125;

          umgeformt werden. In einem Koordinatensystem in der komplexen Ebene sind ja die Koordinaten der jeweiligen Achsen schon der Real- bzw. Imaginärteil. Und diese werden dann iteriert..

          while(i<=10) {
                z = x*x-y*y;
                y = 2*x*y;
                x = z;
                i++;
                }

          Die andere while-Schleife nimmt die einzelnen Bildschirmkoordinaten durch, mehr nicht.

          mfg,
          Matthias

          1. P.S.:

            Mit iterieren meine ich laufend Quadrieren, und bei den komplexen Zahlen sieht das dann ja so aus:

            In meinem Fall:

            (x+y*i)*(x+y*i)
            = x*x-y*y+2*x*y*i

            Der linke Teil x*x-y*y ist reell, während dr rechte Teil 2*x*y*i imaginär ist. Das sind dann die Koordinaten des Quadrats der ursprünglichen komplexen Zahl in der Ebene. Und wenn sich eine komplexe Zahl auch nach vielen Iterationsschritten nicht dem Unendlichen annähert, dann gehört diese Zahl zur jeweiligen Julia-Menge. Andere Julia-Mengen entstehen, wenn man zwischen den einzelnen Quadrierungen noch eine Konstante c hinzufügt. Für jede Konstante c gibt es eine spezielle Julia-Menge.

            mfg,
            Matthias

            1. Hallo Matthias,

              so, jetzt habe ich (glaube ich) Dein Programm verstanden. Deine Art einzurücken hat mich etwas verwirrt. Und das Du die for-Schleifen konsequent durch while-Schleifen ersetzt, war auch etwas irreführend. Auf den (jetzt) 2. Blick sehe ich keinen Fehler mehr, aber vieleicht sind ja 10 Iterationsschritte zu wenig, um im Grenzbereich zwischen Konvergenz und Divergenz zu entscheiden, was es ist?

              Gruß, Jürgen

              1. Hallo Jürgen,

                ich habs jetz. Ich Vollidiot habe ja einfach a und b als Integer-Variablen deklariert, und diese einfach so mir nichts, dir nichts benutzt um eine Double-Variable zu bezeichnen. Dadurch wurden nur die ganzzahligen Pixel ausgefüllt, und es entstand dieses Zwölfeck (das ja in sehr grober Auflösung einem Kreis entspricht).

                Alles klar soweit,
                Vielen Dank für deine Bemühungen,
                Mfg
                Matthias

    2. Hallo Jürgen,

      die Mandelbrotmenge (Apfelmännchen) ist sozusagen eine Zusammenfasssung von Juliamengen.
      Jeder Punkt in der Mandelbrotmenge ist das Startwertepaar für eine Juliamenge.
      Eine Eigenschaft (weiß nicht mehr welche) dieser wird dann durch die Farbe dargestellt.

      CYa
      GONZO