Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Java] Problemen met Mandelbrot figuur.

Pagina: 1
Acties:
  • 496 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Gegroet,

voor een practicum opgave moet ik een Mandelbrot figuur programmeren maar ik heb er wat problemen mee:

-ik krijg nu nog alleen maar een langzaam ladend geel vlak, eerst kreeg ik nog tenminste een langzaam ladend rood en geel vlak.
-ik weet dat het aan de schaal ligt, maar ik weet niet waar en hoe ik deze kan 'instellen'.
-ik heb nog geen idee hoe ik de schaal textbox en maximale aantal herhalingen textbox kan 'instellen'.

De bedoeling is dat ik uiteindelijk een Mandelbrot figuur heb met verschillende kleuren, waar je met behulp van de textboxen de beginwaarden, de schaalfactor en het maximum aantal herhalingen kan bepalen.

Later moet er nog een mogelijkheid bijkomen om met de muis te kunnen inzoomen, maar dat komt later.

code:
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
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Mandelbrot extends Applet
                        implements ActionListener,
                        MouseListener
{
    double scale, schaal;   
    public int width;
    public int height;
    public int max;
    public TextField xbox, ybox, scalebox, maxbox;
    public double x, y, wscale, wmax;
        
    public void init ()
    {
//      maakt textboxen
        int maxPar; //maximale parameter
        x =0;
        y =0; //doen iets
        double xPar, yPar, scalePar; //voor de doubles
        xPar = 0.0;
        yPar = 0.0;
        scalePar = 0.01;
        maxPar = 100;
        width = this.getWidth();
        height = this.getHeight();
        xbox = new TextField ("X", 15); this.add(xbox);
        xbox.addActionListener(this);
        ybox = new TextField ("Y", 15); this.add(ybox);
        ybox.addActionListener(this);
        scalebox = new TextField ("Schaal", 15); this.add(scalebox);
        scalebox.addActionListener(this);
        maxbox = new TextField ("Aantal herhalingen", 15); this.add(maxbox);
        maxbox.addActionListener(this);
        xbox.setText(""+xPar);
        ybox.setText(""+yPar);
        scalebox.setText(""+scalePar);
        maxbox.setText(""+maxPar);
        this.add(xbox);
        this.add(ybox);
        this.add(scalebox);
        this.add(maxbox);

        
    }
    public void actionPerformed(ActionEvent e)
    {
        x = Double.parseDouble(xbox.getText());
        y = Double.parseDouble(ybox.getText());
        scale = Double.parseDouble(scalebox.getText());
        max = Integer.parseInt(maxbox.getText());
        this.repaint();
        }
//  Berekend mandelbrotgetal
    public int mandelbrot(double x, double y)
    {   double a, b;
        a=0; b=0;
        int mandelbrot;
        mandelbrot = 0;
        
        while ((Math.sqrt(a*a + b*b)<=4) && (mandelbrot<=max)) 
        {
            double aOud = a;
            a = aOud*aOud-b*b + x;
            b = 2*aOud*b + y;
            mandelbrot++;
        }
        return(mandelbrot);
    }
//  tekent mandelbrot
    public void paint (Graphics g)  
    {
        for (int x = 0; x<400; x++)
        {
            for (int y = 0; y<400; y++)
            {   double mandelX, mandelY;
            mandelX = (x-200) * scale;
            mandelY = (y-200) * scale;
            tekenPixel(x,y,g, mandelbrot(mandelX, mandelY));
            }
        }
    }
//  bepaald kleur mandelbrot
    public void tekenPixel (int x, int y, Graphics g, int mandelbrot)
    {
        if (mandelbrot % 2 == 0)
            g.setColor(Color.red); 
        else 
            g.setColor(Color.yellow);           
        
//      double a = x * schaal;
//      double b = y * schaal;
//      // MOET NOG OPGESCHOVEN EN OMGEREKEND WORDEN
//      // BEREKEN HIER DE KLEUR MBV 'MANDELGETAL%2'
        g.fillRect (x,y,1,1);
    }
    public void mouseClicked (MouseEvent e)
    {
    }
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
}

[ Voor 14% gewijzigd door Verwijderd op 04-10-2007 17:32 ]


  • Marcj
  • Registratie: November 2000
  • Laatst online: 21:12
mandelX en mandelY zijn nu alleen afhankelijk van xbox en ybox (waar je de tekst uit haalt), waardoor je steeds dezelfde coordinaat in mandelbrot() berekend.

Sowieso zou ik eerst eens heengaan en je tekening maken in een buffer, zodat hij niet met elke paint() aanroep opniew begint met berekenen.

Verwijderd

Topicstarter
Marcj schreef op donderdag 04 oktober 2007 @ 16:02:
mandelX en mandelY zijn nu alleen afhankelijk van xbox en ybox (waar je de tekst uit haalt), waardoor je steeds dezelfde coordinaat in mandelbrot() berekend.

Sowieso zou ik eerst eens heengaan en je tekening maken in een buffer, zodat hij niet met elke paint() aanroep opniew begint met berekenen.
Heb de code wat veranderd en in de eerste post geplaatst.

En hoe moet ik een buffer maken? Dat is me nog niet bekend.

Verwijderd

Ik heb de opdracht ook gedaan. Je hebt geen buffer nodig. Zorg dat je het mandelbrotfiguur tekent in de paint method (niet het graphics object meegeven als parameter).

Je code ziet er redelijk rommelig uit. Begin gewoon met twee methods om te testen (paint en mandelbrot) en gebruik wat hardcoded values; bijvoorbeeld (0 + 0.01 * i/j) als parameter voor de mandelbrot method. Het toevoegen van input via textfields kan later wel.

Mijn paint method om je wat te helpen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public void paint(Graphics g)
    {
        //Create a grid with the dimensions of appletDimensions.
        for (int i = 0; i < appletDimension; i++)
        {
            for (int j = 0; j < appletDimension; j++)
            {
                //Calculate the scaledPosition based on iteration and coordinate.
                double scaledPositionHorizontal = this.scaledPosition(i, xCoordinate);
                double scaledPositionVertical = this.scaledPosition(j, yCoordinate);
                
                //Calculate the Mandelbrot number for the scaled positions.
                int number = this.computeNumber(scaledPositionHorizontal, 
                        scaledPositionVertical);
                
                //For each Mandelbrot number, retrieve a colour.
                g.setColor(this.getColor(number));
                
                //Draw each grid point.
                g.fillRect(i, j, 1, 1);
            }           
        }
    }

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op donderdag 04 oktober 2007 @ 17:49:
Ik heb de opdracht ook gedaan. Je hebt geen buffer nodig.
Niet nodig, wel handig. Het berekenen van de MandelBrot is relatief duur. In de paint() kun je je beter slechts concentreren op het daadwerkelijk tekenen, het berekenen kun je daarbuiten doen. Dit zorgt ervoor dat het niet steeds opnieuw berekend hoeft te worden als je een andere window over je mandelbrot window heen sleept en weer weghaalt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op donderdag 04 oktober 2007 @ 18:00:
[...]

Niet nodig, wel handig. Het berekenen van de MandelBrot is relatief duur. In de paint() kun je je beter slechts concentreren op het daadwerkelijk tekenen, het berekenen kun je daarbuiten doen. Dit zorgt ervoor dat het niet steeds opnieuw berekend hoeft te worden als je een andere window over je mandelbrot window heen sleept en weer weghaalt.
Het berekenen kost inderdaad veel tijd. Echter, aangezien de deadline vrijdag is en een buffer niet noodzakelijk is voor de opdracht kan hij dat denk ik beter even laten voor wat het is.

Maar ik ben wel een beetje nieuwsgierig, bedoel je als buffer gewoon een twee dimensionale array om de mandelbrot nummers in op te slaan?

  • Marcj
  • Registratie: November 2000
  • Laatst online: 21:12
Het is misschien wel makkelijk om gewoon een BufferedImage aan te maken en daar op te tekenen. Bij de paint kun je dan gewoon deze image gaan tekenen met drawImage.

[ Voor 21% gewijzigd door Marcj op 04-10-2007 20:01 ]


  • Qoning
  • Registratie: September 2007
  • Laatst online: 24-11 20:39
Je bent wel laat he want morgen moet je het inleveren :D

Overigens kan je dit nog aanpassen om het net wat sneller te maken:

code:
1
while ((Math.sqrt(a*a + b*b)<=4) && (mandelbrot<=max))


door er dit van te maken

code:
1
while (a * a + b * b <= 16 && mandelbrot <= max)


(a^2 + b^2)^0.5 = 4 is namelijk equivalent met a^2 + b^2 = 4^2
Pagina: 1