1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
import java.util.*;
import java.io.*;
/**
* Medieninformatik, I.Semester / FH-Wiesbaden<br>
* Ubungsblatt 10<br>
* <br>
* Das Programm erzeugt eine Datei, welche einen beliebigen Ausschitt der Mandelbrot-Menge zeigt<br>
* <br>
* getestet mit WinXP, Servicepack2 / Java 5.0<br>
* @author Sebastian Schmitt
* @version 1.0
*/
public class mandelbrot {
/**
* @param args Komadozeilenparameter
*/
public static void main(String[] args)
throws FileNotFoundException{
if (args.length!=6 || !(isStringDouble(args[0])) || !(isStringDouble(args[1])) ||//pruefe Abbruchbedingungen
!(isStringDouble(args[2])) || !(isStringInt(args[3])) || !(isStringInt(args[4])))
error();
else{
double leftx = Double.parseDouble(args[0]); //linker rand
double lefty = Double.parseDouble(args[1]); //unterer rand
double size = Double.parseDouble(args[2]); //groesse
int pixel = Integer.parseInt(args[3]); //Anzahl pixel pro Achse
int grey = Integer.parseInt(args[4]); //AnzahlGraustufen
double field[][][] = new double [pixel][pixel][2]; //Erzeuge Array
double delta = size/pixel;
for (int i=0;i<pixel;i++) //Weise den Arrayfeldern die Werte der komplexen Zahlen zu
for (int j=0; j<pixel;j++){
field [i][j][0]= leftx + (i*delta);
field [i][j][1]= lefty + size - (j*delta);
}
int grauwerte[][]= new int [pixel][pixel];//Erzeuge neues Array für ergebnisse
for (int i=0;i<pixel;i++) //schreibt in das neue Array ueber die rekursive
for (int j=0;j<pixel;j++){ //Funktion konvergenz() die Ergebnisse/Grauwerte
grauwerte[i][j]=grey - konvergenz(field[i][j][0],field[i][j][1],0,0,0,grey);
}
Formatter ausgabe = new Formatter (new File(args[5])+".pgm");
ausgabe.format("%s\n %s %s\n %s %s\n %s\n","P2","#",args[5]+".pgm",pixel,pixel,grey);
//Formatiert den Kopf der pgm-Datei
for (int i=0;i<pixel;i++) //Schreibt die Grauwerte in die pgm-Datei
for (int j=0;j<pixel;j++){
if (j==pixel-1)
ausgabe.format("%2d\n ",grauwerte[j][i]);
else
ausgabe.format("%2d ",grauwerte[j][i]);
}
ausgabe.close();
}
}
/**
* Die Funktion errechnet rekursiv die Werte der Mandelbrot-Folge
*
* @param a Realteil d. Kompl. Zahl
* @param b Imaginaerteil d. Kompl. Zahl
* @param c Re(n-1)
* @param d Im(n-1)
* @param z Zaehler
* @param max maximale Graustufen
* @return Anzahl maximaler Iterationen
*/
static int konvergenz(double a,double b,double c,double d, int z, int max){
if (((c*c)+(d*d))>4)
return z;
else if (z==0)
return konvergenz(a,b,a,b,z+1,max);
else if (z==max)
return z;
else
return konvergenz(a,b,(c*c)-(d*d)+a,(2*c*d)+b,z+1,max);
}
/**
* Die Funktion prueft, ob ein String ein Double ist
* @param str Komandozeilenparameter-String
* @return true/false
*/
static boolean isStringDouble(String str){
char zahl[]=new char [str.length()];
int zaehler=0,punkt=0;
for (int i=0;i<str.length();i++){
zahl[i]=str.charAt(i);
if ( !((Character.isDigit(zahl[i])) || (zahl[i]=='.') || (zahl[i]=='-')))
zaehler+=1;
if (zahl[i]=='.')
punkt+=1;
}
if (zaehler!=0 || punkt>1) return false;
else return true;
}
/**
* Die Funktion prueft, ob ein String ein Integer ist
* @param str Komandozeilenparameter-String
* @return true/false
*/
static boolean isStringInt(String str){
char zahl[]=new char [str.length()];
int zaehler=0;
for (int i=0;i<str.length();i++){
zahl[i]=str.charAt(i);
if ( !((Character.isDigit(zahl[i])) || (zahl[i]=='-')))
zaehler+=1;
}
if (zaehler==0) return true;
else return false;
}
/**
* Die Funktion informiert bei falscher Benutzung
* ueber die Handhabung des Programmes
*/
static void error(){
System.out.println("Falsche Eingaben, bitte beim naechsten Mal folgendermassen vorgehen:");
System.out.println("- param1 u. param2: geben die untere, linke Ecke des Bildausschnittes an ");
System.out.println("- param3: gibt die groesse des Bildausschnittes an ");
System.out.println("- param4: gibt die Anzahl der Pixel horizontal und vertikal an");
System.out.println("- param5: gibt die Anzahl der Graustufen an ");
System.out.println("- param6: gibt den Namen der Zieldatei an (Bitte ohne Endung!)");
}
}
|