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
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);
*/
}
}