Mit Hilfe des folgenden Java-Schnipsels kann eine beliebige Juliamenge in Farbe dargestellt werden. Mittels der linken Maustaste kann ausserdem ein Bereich markiert werden, der anschliessend vergrössert werden soll. Für die Kompilierung des hier vorliegenden Quelltextes wird allerdings das Java Utility Package von Aegidius Plüss benötigt.
Dazugehörender Artikel: Darstellung einer Julia- und Mandelbrotmenge mittels Java
import ch.aplu.util.*;
import java.awt.*;
import java.awt.event.*;
/**
* Diese Klasse zeichnet eine Juliamenge, in die hinein gezoomt werden kann.
*
* Benötigt: Java Utility Package
* http://www.aplu.ch/home/apluhomex.jsp?site=65
*
* Autor: Pascal Hollenstein <webmaster@zockerade.com>
* Version: 1.0
*/
class JuliaSetWithZoom {
/**
* Die Grenze, ab welcher der Punkt als divergiert angesehen werden soll.
*/
int limit = 100;
/**
* Die Anzahl an Iterationen.
*/
int iteration_number = 0;
/**
* Das Ergebnis nach der Iterierung eines Punktes.
*/
double[] iteration_result = new double[2];
/**
* Die X- und Y-Koordinate des obersten linken Punktes des Koordinatensystems.
*/
double[] coords = { -1.4, 1.4 };
/**
* Länge des gesamten Koordinatensystems.
*/
double coord_length = 2.8;
/**
* Der Imaginär- und Realteil der c-Konstante.
*/
double[] absolute_term_c = { 0.378, 0.325 };
/**
* Die X- und Y-Koordinate des Startpunktes der Zoom-Box.
*/
double[] zoom_start_coords = { 0, 0 };
/**
* Die X- und Y-Koordinate des Endpunktes der Zoom-Box.
*/
double[] zoom_end_coords = { 0, 0 };
/**
* Schritt in X-Richtung.
*/
double x_coord_step = (-coords[0] + coords[0] + coord_length) / 500;
/**
* Schritt in Y-Richtung
*/
double y_coord_step = (coords[1] - coords[1] + coord_length) / 500;
/**
* GPanel-Instanz
*/
GPanel p = new GPanel(
"JuliaSet",
coords[0],
coords[0] + coord_length,
coords[1] - coord_length,
coords[1]
);
/**
* Der Konstruktor dieser Java-Klasse. Er färbt die einzelnen Pixel
* ein, legt ein Koordinatensystem darüber und zeigt die Rekursion
* an. Ausserdem handhabt er die Zoom-Funktionalität.
*
* @see #draw_points()
* @see #show_recursion()
* @see #show_coordinate()
*/
JuliaSetWithZoom() {
p.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
zoom_start_coords[0] = zoom_end_coords[0] = p.toWindowX(e.getX());
zoom_start_coords[1] = zoom_end_coords[1] = p.toWindowY(e.getY());
}
public void mouseReleased(MouseEvent e) {
if (zoom_end_coords[0] > zoom_start_coords[0]) {
p.clear();
p.setPaintMode();
coords[0] = zoom_start_coords[0];
coords[1] = zoom_start_coords[1];
coord_length = zoom_end_coords[0] - zoom_start_coords[0];
p.window(
coords[0],
coords[0] + coord_length,
coords[1] - coord_length,
coords[1]
);
x_coord_step = (-coords[0] + coords[0] + coord_length) / 500;
y_coord_step = (coords[1] - coords[1] + coord_length) / 500;
draw_points();
show_recursion();
show_coordinate();
}
}
});
p.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
p.setXORMode(Color.black);
p.rectangle(
zoom_start_coords[0],
zoom_start_coords[1],
zoom_end_coords[0],
zoom_end_coords[1]
);
double current_zoom_coord_x = p.toWindowX(e.getX());
if (current_zoom_coord_x > zoom_start_coords[0]) {
zoom_end_coords[0] = current_zoom_coord_x;
zoom_end_coords[1] = zoom_start_coords[1] - zoom_end_coords[0] + zoom_start_coords[0];
p.color(Color.red);
p.rectangle(
zoom_start_coords[0],
zoom_start_coords[1],
zoom_end_coords[0],
zoom_end_coords[1]
);
}
}
});
draw_points();
show_recursion();
show_coordinate();
}
/**
* Diese Prozedur färbt die einzelnen Pixel des GPanels ein.
*
* @see #iteration(double, double)
*/
void draw_points() {
for (double i = coords[0]; i <= coords[0] + coord_length; i += x_coord_step) {
for (double j = coords[1] - coord_length; j <= coords[1]; j += y_coord_step) {
iteration(i, j);
if (iteration_number > 0) {
p.color(Color.white);
}
if (iteration_number > 5) {
p.color(Color.pink);
}
if (iteration_number > 10) {
p.color(Color.yellow);
}
if (iteration_number > 15) {
p.color(Color.orange);
}
if (iteration_number > 20) {
p.color(Color.red);
}
if (iteration_number > 25) {
p.color(Color.green);
}
if (iteration_number > 30) {
p.color(Color.blue);
}
if (iteration_number > 35) {
p.color(Color.cyan);
}
if (iteration_number >= 40) {
p.color(Color.black);
}
p.point(i, j);
}
}
}
/**
* Prozedur, welche die gesamte Iteration eines einzelnen Punktes durchführt.
*
* @see #iteration_step(double, double)
* @see #get_length(double, double)
*
* @param double x
* @param double y
*/
void iteration(double x, double y) {
iteration_number = 0;
iteration_step(x, y);
while (get_length(x, y) < limit && iteration_number < 40) {
iteration_step(iteration_result[0], iteration_result[1]);
iteration_number += 1;
}
}
/**
* Prozedur, welche einen einzelnen Iterations-Schritt durchführt.
*
* @param double x
* @param double y
*/
void iteration_step(double x, double y) {
iteration_result[0] = Math.pow(x, 2) - Math.pow(y, 2) + absolute_term_c[0];
iteration_result[1] = 2 * x * y + absolute_term_c[1];
}
/**
* Methode, welche den Abstand eines Punktes zu dessen Abbild
* berechnet und zurückgibt.
*
* @param double x
* @param double y
*
* @return double
*/
double get_length(double x, double y) {
return Math.sqrt(Math.pow(iteration_result[0] - x, 2) + Math.pow(iteration_result[1] - y, 2));
}
/**
* Prozedur, welche die Rekursion anzeigt.
*/
void show_recursion() {
p.color(Color.gray);
p.text(
coords[0] + (4 * x_coord_step),
coords[1] - (14 * y_coord_step),
"w = z^2 + " + absolute_term_c[0] + " + " + absolute_term_c[1] + "i"
);
}
/**
* Diese Prozedur zeichnet ein Koordinatenkreuz mitsamt Beschriftung.
*/
void show_coordinate() {
p.color(Color.gray);
double[] absolute_zero = {
(coords[0] + coords[0] + coord_length) / 2,
(coords[1] + coords[1] - coord_length) / 2
};
p.line(
absolute_zero[0],
coords[1] - coord_length,
absolute_zero[0],
coords[1]
);
p.line(
coords[0],
absolute_zero[1],
coords[0] + coord_length,
absolute_zero[1]
);
double dy = (coords[1] - coords[1] + coord_length) / 4;
double dx = (coords[0] + coord_length - coords[0]) / 4;
for (int i = 1; i < 4; i++) {
p.line(
absolute_zero[0] - 5 * x_coord_step,
coords[1] - coord_length + i * dy,
absolute_zero[0] + 5 * x_coord_step,
coords[1] - coord_length + i * dy
);
p.line(
coords[0] + i * dx,
absolute_zero[1] + 5 * y_coord_step,
coords[0] + i * dx,
absolute_zero[1] - 5 * y_coord_step
);
if (i == 3) {
p.text(
absolute_zero[0] + 10 * x_coord_step,
coords[1] - coord_length + i * dy - 5 * y_coord_step,
String.valueOf(Math.floor((coords[1] - coord_length + 3 * dy) * 10000) / 10000)
);
p.text(
coords[0] + i * dx - 25 * x_coord_step,
absolute_zero[1] - 20 * y_coord_step,
String.valueOf(Math.floor((coords[0] + 3 * dx) * 10000) / 10000)
);
}
}
}
/**
* Die Hauptprozedur.
*/
public static void main(String[] args) {
new JuliaSetWithZoom();
}
}