JavaFX Mandelbrot-bild noch nicht optimiert

morry329

Mitglied
Hallo zusammen,

ich wollte ein Mandelbrot-Rätsel fertig machen, aber mein Code gibt im JavaFX-Fenster nicht richtig aus:

Bildschirmfoto 2023-11-22 um 18.43.21.png

Hier mein Code - vielleicht kann jemand mir eine Hilfsstellung geben? Ich glaub, die Zeile z = z.mul(c, z).add(c); noch paar Fehler enthält, aber ich bin nicht mehr weiter gekommen.
Java:
private Image createMandelbrotImage() {

        double realStep = (REAL_MAX - REAL_MIN) / WIDTH; //koordinate realen Schritt
        double imaginaryStep = (IMAGINARY_MAX - IMAGINARY_MIN) / HEIGHT; //koordinate imaginäre Schritt

        javafx.scene.image.WritableImage image = new javafx.scene.image.WritableImage(640, 480);
        javafx.scene.image.PixelWriter pixelWriter = image.getPixelWriter();

        //Koordinaten festlegen und in den loop laufen lassen
        for (int x = 0; x < WIDTH; x++) {
            for (int y = 0; y < HEIGHT; y++) {
                double real = REAL_MIN + x * realStep;
                double imaginary = IMAGINARY_MIN + y * imaginaryStep;

                ComplexNumber c = new ComplexNumber(real, imaginary);
                
                //Farbe für das Mandelbrot festlegen
                if (isPartOfMandelbrotSet(c)) {
                    pixelWriter.setColor(x, y, Color.BLACK);
                }
            }
        }

        return image;
    }

    static boolean isPartOfMandelbrotSet(ComplexNumber c) {
        int maxIterations = 50;

        ComplexNumber z = new ComplexNumber(0, 0);

        for (int i = 0; i < maxIterations; i++) {
          
            //Koordinate multiplieren und addieren
            //damit das Mandelbrot ausgegeben wird
            z = z.mul(c, z).add(c);


            if (ComplexNumber.abs(z) >= 2.0) {
                return false; //das komplexe Zahl ist kein Teil vom Mandelbrot
            }
        }

        return true; //das komplexe Zahl ist wahrscheinlich Teil vom Mandelbrot
    }
 

MisterBu

Aktives Mitglied
Das ist auf jeden Fall nicht die Mandelbrot Menge (Apfelmännchen). Ich schließe mich meinem Vorredner an. Um da weiter zu helfen braucht man den Quelltext von ComplexNumber. Habe selber vor kurzem ein Apfelmännchen gezeichnet. Allerdings mit Swing. Meine Complex Klasse sieht folgendermassen aus:
Java:
package pack;
public class Complex
{
    private double re = 0.0;
    private double im = 0.0;
    public Complex(double d1,double d2)
    {
        re = d1;
        im = d2;
    }
    public double getRe()
    {
        return re;
    }
    public double getIm()
    {
        return im;
    }
    public void setRe(double d)
    {
        re = d;
    }
    public void setIm(double d)
    {
        im = d;
    }
    public double getBetrag()
    {
        double erg1 = re * re + im * im;
        double erg = Math.sqrt(erg1);
        return erg;
    }
    public void add(Complex z)
    {
        re = re + z.getRe();
        im = im + z.getIm();
    }
    public void mult(Complex z)
    {
        double dre = re * z.getRe() - im * z.getIm();
        double dim = re * z.getIm() + im * z.getRe();
        re = dre;
        im = dim;
    }
}
 

MisterBu

Aktives Mitglied
Auch
Java:
z = z.mul(c, z).add(c);
ist falsch. Es müßte
Code:
z = z.mul(z,z).add(c);
sein.
Bzw bei meiner Complex Klasse
Code:
z.mult(z);
z.add(c);
 

inixweiss

Mitglied
@morry329

Habe mal den Algo von Wikipedia https://de.wikipedia.org/wiki/Mandelbrot-Menge#Iteration_über_alle_Bildpunkte umgesetzt, es geht auch ohne zusätzliche Klassen für Komplexe Zahlen:

1700747162484.png

Ich glaube, das ist das gesuchte Fraktal.

Der Trick ist, die Bildpunkte nicht von (0,... , 0,...) durchzugehen, sondern bei (-max_x / 2 + x) usw. anzufangen, weil in Java der Punkt (0,0) oben links anfängt, nicht in der Mitte.

Java:
import javax.swing.*;
import java.awt.*;

public class Apfel {
    public static void showApfel() {
        float zoom = 1;
        //int cx = 0;
        //int cy = 0;

        JFrame frame = new JFrame("Apfel");
        frame.add(new Canvas() {
            int julia(final float c1, final float c2, final float max1, final int max2) {
                float xx = c1 * c1;
                float yy = c2 * c2;
                float xy = c1 * c2;
                float amount = xx + yy;
                int remain = max2;
                for (; amount <= max1 && 0 < remain; remain--) {
                    float x = xx - yy + c1;
                    float y = xy + xy + c2;
                    xx = x * x;
                    yy = y * y;
                    xy = x * y;
                    amount = xx + yy;
                }
                return max2 - remain;
            }

            Color chooseColor(final int iterations, final int maxIterations) {
                float f = iterations / 100f;
                f = Math.min(1f, f);
                return new Color(f, f, f);
            }

            @Override
            public void paint(final Graphics g) {
                float max_x = getWidth();
                float max_y = getHeight();
                int c1min = 0;
                int c1max = (int) (zoom * 5);
                int c2min = 0;
                int c2max = (int) (zoom * 5);
                for (int y = 0; y < max_y; y++) {
                    float c2 = c2min + (c2max - c2min) * (-max_y / 2 + y) / max_y;
                    for (int x = 0; x < max_x; x++) {
                        float c1 = c1min + (c1max - c1min) * (-max_x / 2 + x) / max_x;
                        float maxAmount = 100;
                        int maxIterations = 10_000;
                        int iterations = julia(c1, c2, maxAmount, maxIterations);
                        Color color = chooseColor(iterations, maxIterations);
                        g.setColor(color);
                        g.fillRect(x, y, 1, 1);
                    }
                }
            }
        });
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        showApfel();
    }
}
 

inixweiss

Mitglied
Juup, ungefähr so sieht es auch bei Wikipedia aus... Die möglichen Farbwerte solltest du aber vorher einmal berechnen und speichern, damit dann schneller gerendert werden kann.

1700757902569.png
 

morry329

Mitglied
Hallo zusammen,

nochmals herzlichen Dank für alle Code-Beispiele und Vorschläge: wie ihr vermutet, gab es logische Fehlern bei der Klasse Complexnumber. In den Code unten habe ich die Nummern angepasst mithilfe eure Beispiele.

Java:
public class ComplexNumber {
    private double real;
    private double imaginary;

    public ComplexNumber(double real, double imaginary){
        this.real = real;
        this.imaginary = imaginary;
    }

    public double getReal(){
        return real;
    }

    public double getImaginary(){
        return imaginary;
    }

    public ComplexNumber add(ComplexNumber c2) {
        real = real + c2.getReal();
        imaginary = imaginary + c2.getImaginary();

        ComplexNumber result = new ComplexNumber(real, imaginary);

        return result;
    }

    public ComplexNumber mul(ComplexNumber c1, ComplexNumber c2){
        //die Berechnung diese Variablen waren vorher falsch
        double realPart = real * c1.getReal() - imaginary*c2.getImaginary();
        double imaginaryPart = real * c1.getImaginary() + imaginary*c2.getReal();

        ComplexNumber multiplied = new ComplexNumber(realPart, imaginaryPart);
        return multiplied;
    }

    public static double abs(ComplexNumber c) {
        double squaredSum = c.real * c.real + c.imaginary * c.imaginary;
        double result = Math.sqrt(squaredSum);

        return result;
    }
}

class Mandelbrot{
    private Image createMandelbrotImage() {

        double realStep = (REAL_MAX - REAL_MIN) / WIDTH;
        double imaginaryStep = (IMAGINARY_MAX - IMAGINARY_MIN) / HEIGHT;

        javafx.scene.image.WritableImage image = new javafx.scene.image.WritableImage(640, 480);
        javafx.scene.image.PixelWriter pixelWriter = image.getPixelWriter();

        for (int x = 0; x < WIDTH; x++) {
            for (int y = 0; y < HEIGHT; y++) {
                double real = REAL_MIN + x * realStep;
                double imaginary = IMAGINARY_MIN + y * imaginaryStep;

                ComplexNumber c = new ComplexNumber(real, imaginary);

                if (isPartOfMandelbrotSet(c)) {
                    pixelWriter.setColor(x, y, Color.BLACK);
                }
            }
        }

        return image;
    }

    static boolean isPartOfMandelbrotSet(ComplexNumber c) {
        int maxIterations = 50;

        ComplexNumber z = new ComplexNumber(0, 0);

        for (int i = 0; i < maxIterations; i++) {
            //die Darstellung des Mandelbrots auch richtig angepasst
            z = z.mul(z, z).add(c);


            if (ComplexNumber.abs(z) >= 2.0) {
                return false;
            }
        }

        return true;
    }
}

Mein Mandelbrot sieht so jetzt aus: ist halt noch nicht schön gefärbt wie eure Beispiele, aber das mache ich später wenn ich mehr Zeit dafür habe.


Bildschirmfoto 2023-11-24 um 21.11.51.png
 

MarvinsDepression

Bekanntes Mitglied
Deine Klasse ComplexNumber bedarf aber noch Nachbesserungen.
Die Methode
Java:
public ComplexNumber add(ComplexNumber c2) {
    real = real + c2.getReal();
    imaginary = imaginary + c2.getImaginary();
    ComplexNumber result = new ComplexNumber(real, imaginary);
    return result;
}
verändert zum einen die Eigenschaften der aufrufenden Instanz, gibt aber zusätzlich ein neues Objekt mit identischen Inhalt zurück.
Du solltest dich für eine Variante entscheiden.

Noch dubioser sieht es hier aus
Java:
public ComplexNumber mul(ComplexNumber c1, ComplexNumber c2) {
    double realPart = real * c1.getReal() - imaginary*c2.getImaginary();
    double imaginaryPart = real * c1.getImaginary() + imaginary*c2.getReal();
    ComplexNumber multiplied = new ComplexNumber(realPart, imaginaryPart);
    return multiplied;
}
Hier verknüpfst du gleich die Eigenschaften von drei verschiedenen Instanzen, nämlich der aufrufenden, sowie der zwei als Parameter übergeben.
Ein übergebener Parameter reicht, oder du machst die Methode statisch und rufst sie über den Klassennamen auf.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
M Bild Beschreibung mit ImageIO speichern AWT, Swing, JavaFX & SWT 1
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
C GUI öfters durchlaufen und hinterher Bild speichern AWT, Swing, JavaFX & SWT 1
M AWT Farben in Bild ersetzen AWT, Swing, JavaFX & SWT 11
E JavaFX Bild einfügen AWT, Swing, JavaFX & SWT 6
G paintComponents zerstückelt Bild AWT, Swing, JavaFX & SWT 0
C 2D Grafik ein Bild soll permanent durchlaufen AWT, Swing, JavaFX & SWT 2
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
C Bild Koordinaten AWT, Swing, JavaFX & SWT 6
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
M Bild in JPanel mit Maus einfügen AWT, Swing, JavaFX & SWT 0
B JPanel und png-Bild AWT, Swing, JavaFX & SWT 2
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
O 2D-Grafik Bild abgeschnitten nach Rotation mit Affine Transform und Hintergrund Schwarz AWT, Swing, JavaFX & SWT 8
A Swing Malprogramm Bild speichern? AWT, Swing, JavaFX & SWT 9
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
Y JavaFX Bild speichern und Pfad dazu abspeichern AWT, Swing, JavaFX & SWT 2
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
L 2D-Grafik Bild in Richtung Maus drehen AWT, Swing, JavaFX & SWT 18
C Bild in JFrame AWT, Swing, JavaFX & SWT 8
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
I SWT Bilder, bzw. ein einzelnes Bild AWT, Swing, JavaFX & SWT 6
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
T Mit getSubimage ruckelt das Bild AWT, Swing, JavaFX & SWT 7
T Bild drehen ohne Resize AWT, Swing, JavaFX & SWT 3
A Bild in JLabel skalieren AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
D Bild bewegen mit Tastendruck AWT, Swing, JavaFX & SWT 7
H Bild wird nicht angezeigt, Fehlercode unverständlich AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
C Swing ImageIcon mit Bild aus Temp-Verzeichniss füllen AWT, Swing, JavaFX & SWT 15
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
S Bild skalieren AWT, Swing, JavaFX & SWT 3
D Bild in JFrame nur kurz da AWT, Swing, JavaFX & SWT 9
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
GianaSisters Bild wird S/W gespeichert. AWT, Swing, JavaFX & SWT 4
O Bild auf das JLabel AWT, Swing, JavaFX & SWT 10
D Swing Text auf Bild legen AWT, Swing, JavaFX & SWT 7
S Ein externes Bild in ein JFrame einfügen AWT, Swing, JavaFX & SWT 8
J Swing Bild wird nicht auf JLabel angezeigt AWT, Swing, JavaFX & SWT 12
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
R Bild in Bild finden AWT, Swing, JavaFX & SWT 4
B Bild bearbeiten mit Transparenz (spiegeln, Farben austauschen) AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben