Java Mandelbrotmenge zeichnen

XHotSniperX

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
472
Hallo Leute ich versuche gerade ne Mandelbrotmenge darzustellen und das habe ich auch geschafft aber mir gefällt die Farbe überhaupt nicht. Wie kann ich das verbessern, dass die Farbe schön alles mögliche hat von Blau über Gelb bis Rot? Geht das überhaupt?

Ich habe im Code viel Kommentiert, damit alles klar ist.
Im Anhang seht ihr, was das Resultat ist und dass es nicht schön aussieht... Ich kann ja die Farbe bisschen varieren mit dem Multiplikator aber das ist nciht wirklich dynamisch. Und wenn ich da übertreibe mit den Multiplikatoren, dann meckert natürlich der Compiler. xD

Bin gespannt auf Tipps :)

Code:
package Praxis;
import Praxis.ch.unibas.informatik.cs101.ImageWindow;

/* Die Komplexen Zahlen a+b i, mit (a+bi)+(c+di) = (a+c)+(b+d)i und (a+bi)(c+di) = (ac-bd)+(ad+bc)i */
class Complex {

  /* Definieren Sie hier die Daten der Klasse */

  private double a;		//Reeller Teil
  private double b;		//Imaginärer Teil

  /* Der Konstruktor */
  public Complex(double a, double b) { /* Implementieren */
	  this.a = a;
	  this.b = b;
  }

  /* Zugriff auf den realen Anteil */
  double real() { /* Implementieren */ 
	  return a;
  }
  /* Zugriff auf den imaginaeren Anteil */
  double imag() { /* Implementieren */ 
	  return b;
  }

  /* Multiplikation ohne Veraenderung der beteiligten Objekte */
  Complex mult(Complex o) {/* Implementieren */ 
	  
	  double re = a*o.real() - b*o.imag();
	  double im = a*o.imag() + b*o.real();
	  Complex x = new Complex(re, im);
	  return x;
  }

  /* Multiplikation mit Veraenderung der beteiligten Objekte. Gibt this zurueck */
  Complex mult_inplace(Complex o) {/* Implementieren */ 
	  
	  double re = a*o.real() - b*o.imag();
	  double im = a*o.imag() + b*o.real();
	  a = re;
	  b = im;
	  return this;
  }

  /* Das Quadrat (c^2 = c*c) ohne Veraenderung der beteiligten Objekte */
  Complex sqr() { /* Implementieren */ 
	  
	  double re = a*a - b*b;
	  double im = 2*a*b;
	  Complex x = new Complex(re, im);
	  return x;
  }

  /* Das Quadrat (c^2 = c*c) in place. Veraendert das Objekt und gibt this zurueck. */
  Complex sqr_inplace() { /* Implementieren */  
	  
	  double re = a*a - b*b;
	  double im = 2*a*b;
	  a = re;
	  b = im;
	  return this;
  }

  /* Das Quadrat des Betrags */
  double abs_sqr() { /* Implementieren */ 
	  
	  double x;
	  x = a*a+b*b;
	  return x;
  }

  /* Addition zweier komplexer Zahlen ohne Veraenderung der beteiligten Objekte */
  public Complex add(Complex c) {     /* Implementieren */   
	  
	  double re = a+c.real();
	  double im = b+c.imag();
	  Complex x = new Complex(re, im);
	  return x;
  }

  /* Addition zweier komplexer Zahlen mit Veraenderung der beteiligten Objekte */
  public Complex add_inplace(Complex c) {    /* Implementieren */   
	  
	  double re = a+c.real();
	  double im = b+c.imag();
	  a = re;
	  b = im;
	  return this;
  }
}

public class Mandelbrot {

  public static void show_mandelbrot(Complex c_origin, double c_step, int max_iter) {
    ImageWindow sourceWindow= new ImageWindow(640,480);
    sourceWindow.openWindow("mandelbrot",0,0);
    sourceWindow.resizeImage(640,480);

    /* Implementieren des Mandelbrot Algorithmus */
    
    Complex[][] pixelarray = new Complex[480][640];		//Hier für jeden Pixel c speichern
    int[][] fluchtarray = new int[480][640];		//Hier für jeden Pixel die Fluchtgeschwindigkeit speichern
    Complex k = new Complex(0,0);
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		double re = c_origin.real()+c_step*x;
    		double im = c_origin.imag()+c_step*y;
    		Complex c = new Complex(re, im);
    		pixelarray[y][x] = c;
    		for(int i=0; i<max_iter; i++){
    			if(Math.sqrt(k.real()*k.real()+k.imag()*k.imag())  <  2){
    				k=(k.sqr()).add(c);
    			}
    			else{
    				fluchtarray[y][x] = i;
    				k = new Complex(0,0);
    				break;
    			}	
    		}
    	}
    }    
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		int farbe = (int)(Math.log10(fluchtarray[y][x]));
    		sourceWindow.setPixel(x, y, farbe*60, farbe*40, farbe*60);
    	}
    }

    sourceWindow.redraw();	

  }
  

  public static void show_mandelbrot_inplace(Complex c_origin, double c_step, int max_iter) {
    ImageWindow sourceWindow= new ImageWindow(640,480);
    sourceWindow.openWindow("source",0,0);
    sourceWindow.resizeImage(640,480);

    /* Implementieren des Mandelbrot Algorithmus */
    
    Complex[][] pixelarray = new Complex[480][640];		//Hier für jeden Pixel c speichern
    int[][] fluchtarray = new int[480][640];		//Hier für jeden Pixel die Fluchtgeschwindigkeit speichern
    Complex k = new Complex(0,0);
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		double re = c_origin.real()+c_step*x;
    		double im = c_origin.imag()+c_step*y;
    		Complex c = new Complex(re, im);
    		pixelarray[y][x] = c;
    		for(int i=0; i<max_iter; i++){
    			if(Math.sqrt(k.real()*k.real()+k.imag()*k.imag())  <  2){
    				k=(k.sqr_inplace()).add_inplace(c);
    			}
    			else{
    				fluchtarray[y][x] = i;
    				k = new Complex(0,0);
    				break;
    			}	
    		}
    	}
    }    
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		int farbe = (int)(Math.log10(fluchtarray[y][x]));
    		sourceWindow.setPixel(x, y, farbe*60, farbe*40, farbe*60);
    	}
    }
    
    sourceWindow.redraw();	
  }

  public static void main(String[] args) {
    show_mandelbrot(new Complex(-2.5, -1.3),   0.005, 1000);
    show_mandelbrot(new Complex(-0.755, -0.1), 0.00002, 1000);

    
/*   In Teilaufgabe 3
*    show_mandelbrot_inplace(new Complex(-2.5, -1.3),   0.005, 10000);
*    show_mandelbrot_inplace(new Complex(-0.755, -0.1), 0.00002, 10000);
*/
  }


}
 

Anhänge

  • mandelbrot.jpg
    mandelbrot.jpg
    122,4 KB · Aufrufe: 460
int farbe = (int)(Math.log10(fluchtarray[y][x]));
Kannst du hier nicht einfach nen festen Wert draufaddieren und dann farbe = farbe%255; oder ähnliches schreiben. Ich versteh dein Programm absolut nicht, aber das würde imo Sinn machen.

Kleiner Tipp. Bitte in Zukunft wirklich nur die wesentlichen Abschnitte deines Codes posten. Reinlesen wird sich da höchstwahrscheinlich niemand, wenn du so viel auf einmal postest.
 
Ich würde es etwas anders machen, erstmal ein Array von Color(r,g,b) das dann beliebige Farbverläufe haben kann und dann die Farbwerte so holen: ColorArray[fluchtarray[y][x]%ColorArray.length], sprich je tiefer iteriert desto höherer Farbindex - beschränkt auf Länge des Farbarrays, also würde sich der Farbverlauf danach wiederholen.
 
Danke das probier ich mal. Poste dann das ergebnis
Ergänzung ()

meinst du das so?

Code:
    int[] colorarray = new int[256];
    
    for(int i=0; i<256; i++){
    	colorarray[i] = i;
    }
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		int farbe = colorarray[fluchtarray[y][x]%colorarray.length];
    		sourceWindow.setPixel(x, y, farbe, farbe, farbe);
    	}
    }

Oder wie meinst du den Farbverlauf Color(r,g,b)?
 
XHotSniperX schrieb:
Danke das probier ich mal. Poste dann das ergebnis
Ergänzung ()

meinst du das so?

Code:
    int[] colorarray = new int[256];
    
    for(int i=0; i<256; i++){
    	colorarray[i] = i;
    }
    
    for(int y=0; y<480; y++){
    	for(int x=0; x<640; x++){
    		int farbe = colorarray[fluchtarray[y][x]%colorarray.length];
    		sourceWindow.setPixel(x, y, farbe, farbe, farbe);
    	}
    }

Oder wie meinst du den Farbverlauf Color(r,g,b)?

Uhh .. als Edit gepostet, sowas taucht gar nicht als "Neue Meldung" auf .. :freak:

Egal BTT:
Ja und nein .. ich meinte ein Array aus java.awt.Color.
Code:
Color[] colorarray = new Color[256];

...
sourceWindow.setPixel(x, y, colorarray[fluchtarray[y][x]%colorarray.length]);
bzw wenn die Klasse kein Color setzen kann dann:
Color c = colorarray[fluchtarray[y][x]%colorarray.length];
sourceWindow.setPixel(x, y, c.getRed(), c.getGreen(), c.getBlue());
Welche Farben dann effektiv in dem Array stehen ist beliebig, z.B kannst Du eine kleine Routine Schreiben die sagen wir mal bei Rot anfängt dann nach Gelb einen Farbverlauf macht, danach zu Grün usw .. Oder Du lädst die Palette von Disk, wo sie mit einem Zeichenprogramm erstellt wurde ..

Siehe auch Wikipedia -> Indizierte Farben.
 
Zurück
Oben