Smooth spectrum for Mandelbrot Set rendering

后端 未结 7 1943
梦毁少年i
梦毁少年i 2020-11-28 04:40

I\'m currently writing a program to generate really enormous (65536x65536 pixels and above) Mandelbrot images, and I\'d like to devise a spectrum and coloring scheme that do

相关标签:
7条回答
  • 2020-11-28 05:34

    Here is a typical inner loop for a naive Mandelbrot generator. To get a smooth colour you want to pass in the real and complex "lengths" and the iteration you bailed out at. I've included the Mandelbrot code so you can see which vars to use to calculate the colour.

    for (ix = 0; ix < panelMain.Width; ix++)
        {
        cx = cxMin + (double )ix * pixelWidth;
        // init this go 
        zx = 0.0;
        zy = 0.0;
        zx2 = 0.0;
        zy2 = 0.0;
        for (i = 0; i < iterationMax && ((zx2 + zy2) < er2); i++)
            {
            zy = zx * zy * 2.0 + cy;
            zx = zx2 - zy2 + cx;
            zx2 = zx * zx;
            zy2 = zy * zy;
            }
        if (i == iterationMax)
            {
            // interior, part of set, black
            // set colour to black
            g.FillRectangle(sbBlack, ix, iy, 1, 1);
            }
        else
            {
            // outside, set colour proportional to time/distance it took to converge
            // set colour not black
            SolidBrush sbNeato = new SolidBrush(MapColor(i, zx2, zy2));
            g.FillRectangle(sbNeato, ix, iy, 1, 1);
            }
    

    and MapColor below: (see this link to get the ColorFromHSV function)

     private Color MapColor(int i, double r, double c)
                    {
                    double di=(double )i;
                    double zn;
                    double hue;
    
                        zn = Math.Sqrt(r + c);
                        hue = di + 1.0 - Math.Log(Math.Log(Math.Abs(zn))) / Math.Log(2.0);  // 2 is escape radius
                        hue = 0.95 + 20.0 * hue; // adjust to make it prettier
                        // the hsv function expects values from 0 to 360
                        while (hue > 360.0)
                            hue -= 360.0;
                        while (hue < 0.0)
                            hue += 360.0;
    
                        return ColorFromHSV(hue, 0.8, 1.0);
                    }
    

    MapColour is "smoothing" the bailout values from 0 to 1 which then can be used to map a colour without horrible banding. Playing with MapColour and/or the hsv function lets you alter what colours are used.

    0 讨论(0)
提交回复
热议问题