simone dozio
simone dozio

Reputation: 69

mandlebrot fractal error in the plotted function

Hello guys i am trying plotting the mandlebrot fractal but the result is very far from it, can you help me to find the why?

Here is the code:

void Button1Click(object sender, EventArgs e)
{
    Graphics g = pbx.CreateGraphics();
    Pen p = new Pen(Color.Black);

    double xmin = -2.0;
    double ymin = -1.2;
    double xmax = 0;
    double ymax = 0;
    double x = xmin, y = ymin;
    int MAX = 1000;

    double stepY = Math.Abs(ymin - ymax)/(pbx.Height);
    double stepX = Math.Abs(xmin - xmax)/(pbx.Width);

    for(int i = 0; i < pbx.Width; i++)
    {
        y = ymin;
        for(int j = 0; j < pbx.Height; j++)
        {
            double rez = x;
            double imz = y;
            int iter = 0;

            while(rez * rez + imz * imz <= 4 && iter < MAX)
            {
                rez = rez * rez - imz * imz + x;
                imz = 2 * rez * imz + y;
                iter++;
            }
            if(iter == MAX)
            {
                p.Color = Color.Black;
                g.DrawRectangle(p, i, j, 1, 1);
            }
            else
            {
                p.Color = Color.White;
                g.DrawRectangle(p, i, j, 1, 1);
            }
            y += stepY;
        }
        x += stepX;
    }
}

please help me my mind is getting crushed thinking how to get the beautiful mandlebrot set... and sorry if i committed some mistakes but English is not my speaked language!

Upvotes: 2

Views: 101

Answers (2)

joe
joe

Reputation: 8634

Additionally to Peters answer, you should use a color palette instead of drawing just black and white pixels.

Create a array of colors, like this: (very simple example)

Color[] colors = new Colors[768];
for (int i=0; i<256; i++) {
    colors[i    ]=Color.FromArgb(    i,     0, 0);
    colors[i+256]=Color.FromArgb(255-i,     i, 0);
    colors[i+512]=Color.FromArgb(0    , 255-i, i);
}

Then use the iter value to pull a color and draw it:

int index=(int)((double)iter/MAX*767);
p.Color c = colors[index];
g.DrawRectangle(p, i, j, 1, 1);

Replace the entire if (iter == MAX) ... else ... statement with this last step.

Upvotes: 1

Peter Duniho
Peter Duniho

Reputation: 70671

You have some irregularities elsewhere. The range you're plotting isn't the entire set, and I would calculate x and y directly for each pixel, rather than using increments (so as to avoid rounding error accumulating).

But it looks to me as though your main error is in the iterative computation. You are modifying the rez variable before you use it in the computation of the new imz value. Your loop should look more like this:

while(rez * rez + imz * imz <= 4 && iter < MAX)
{
    double rT = rez * rez - imz * imz + x;

    imz = 2 * rez * imz + y;
    rez = rT;
    iter++;
 }

Upvotes: 2

Related Questions