Kapitel 12: "Bildverarbeitung"

"FraktalBuntFinal.java"


public class FraktalBuntFinal extends FensterSchliesstSchickKurz{
static int aufloesung = 100;
static int fensterRandLRU = 5; // Fensterrand links, rechts, unten
static int fensterRandO = 31; // Fensterrand oben
static int itermax = 2000;// Maximale Anzahl von Iterationen
static int schwellenwert = 35; // bis zum Erreichen des Schwellwerts.
static int[][] farben = {
{ 1, 255,255,255}, // Hohe Iterationszahlen sollen hell,
{ 300, 10, 10, 40}, // die etwas niedrigeren dunkel,
{ 500, 205, 60, 40}, // die "Spiralen" rot
{ 850, 120,140,255}, // und die "Arme" hellblau werden.
{1000, 50, 30,255}, // Innen kommt ein dunkleres Blau,
{1100, 0,255, 0}, // dann grelles Grün
{1997, 20, 70, 20}, // und ein dunkleres Grün.
{itermax, 0, 0, 0}};// Der Apfelmann wird schwarz.

static double bildBreite = 0.000003628;
// Der Ausschnitt wird auf 3:4 verzerrt
static double bildHoehe = bildBreite*3.f/4.f;
// Die Position in der Komplexen-Zahlen-Ebene
static double [] bildPos = {-0.743643135-(2*bildBreite/2),
0.131825963-(2*bildBreite*3.f/8.f)};

BufferedImage bild;

public FraktalBuntFinal (String title1, int w, int h){
super(title1, w, h);

bild = new BufferedImage(aufloesung, aufloesung,
BufferedImage.TYPE_INT_RGB);
Graphics gimg = bild.createGraphics();

berechneBild(gimg);
try {
ImageIO.write(bild, "BMP", new File("ApfelmannBunt.bmp"));
} catch(IOException e){
System.out.println("Fehler beim Speichern!");
}
}

public Color berechneFarbe(int iter){
int F[] = new int[3];
for (int i=1; i < farben.length-1; i++){
if (iter < farben[i][0]){
int iterationsInterval = farben[i-1][0]-farben[i][0];
double gewichtetesMittel = (iter-farben[i][0])/
(double)iterationsInterval;

for (int f=0; f<3; f++){
int farbInterval = farben[i-1][f+1]-farben[i][f+1];
F[f] = (int)(gewichtetesMittel*farbInterval)
+farben[i][f+1];
}

return new Color(F[0], F[1], F[2]);
}
}
return Color.BLACK;
}

public int berechnePunkt(KomplexeZahl c){
KomplexeZahl z = new KomplexeZahl(0,0);
int iter = 0;
for (; (iter <= itermax) && (z.norm() < schwellenwert); iter ++)
z = (z.mal(z)).plus(c);
return iter;
}

public void berechneBild(Graphics g){
for (int x=0; x < aufloesung;x++){
for (int y=0; y < aufloesung; y++){
KomplexeZahl c = new KomplexeZahl(bildBreite*(double)(x)/
aufloesung + bildPos[0],
bildBreite*(double)(y)/
aufloesung + bildPos[1]);
g.setColor(berechneFarbe(berechnePunkt(c)));
g.fillRect(x, y, 1, 1);
}
}
}

public void paint(Graphics g){
g.drawImage(bild, fensterRandLRU, fensterRandO, this);
}

public void update(Graphics g){
paint(g);
}

public static void main(String[] args){
FraktalBuntFinal f = new FraktalBuntFinal("Apfelmännchen - Bunt",
aufloesung+2*fensterRandLRU,
aufloesung+fensterRandLRU+fensterRandO);
f.setVisible(true);
}
}

Picksel Media Marco Block © 2006-2009 – ImpressumKontakt
Gestaltung und Umsetzung Tobias Losch, www.picksel-media.de