How to program a fractal?

后端 未结 14 931
花落未央
花落未央 2020-12-04 05:34

I do not have any experience with programming fractals. Of course I\'ve seen the famous Mandelbrot images and such.

Can you provide me with simple algorithms for fra

相关标签:
14条回答
  • 2020-12-04 05:43

    I would start with something simple, like a Koch Snowflake. It's a simple process of taking a line and transforming it, then repeating the process recursively until it looks neat-o.

    Something super simple like taking 2 points (a line) and adding a 3rd point (making a corner), then repeating on each new section that's created.

    fractal(p0, p1){
        Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
        fractal(p0,Pmid);
        fractal(Pmid, p1);
    }
    
    0 讨论(0)
  • 2020-12-04 05:45

    The Sierpinski triangle and the Koch curve are special types of flame fractals. Flame fractals are a very generalized type of Iterated function system, since it uses non-linear functions.

    An algorithm for IFS:es are as follows:

    Start with a random point.

    Repeat the following many times (a million at least, depending on final image size):

    Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.

    If the point is outside the screen, choose randomly a new one inside the screen instead.

    If you want nice colors, let the color depend on the last used transformation.

    0 讨论(0)
  • 2020-12-04 05:48

    Sometimes I program fractals for fun and as a challenge. You can find them here. The code is written in Javascript using the P5.js library and can be read directly from the HTML source code.

    For those I have seen the algorithms are quite simple, just find the core element and then repeat it over and over. I do it with recursive functions, but can be done differently.

    0 讨论(0)
  • 2020-12-04 05:52

    Here is a codepen that I wrote for the Mandelbrot fractal using plain javascript and HTML.

    Hopefully it is easy to understand the code.

    The most complicated part is scale and translate the coordinate systems. Also complicated is making the rainbow palette.

    function mandel(x,y) {
      var a=0; var b=0;
      for (i = 0; i<250; ++i) {
        // Complex z = z^2 + c
        var t = a*a - b*b;
        b = 2*a*b;
        a = t;
        a = a + x;
        b = b + y;
        var m = a*a + b*b;
        if (m > 10)  return i;
      }
      return 250;
    }
    

    0 讨论(0)
  • 2020-12-04 05:56

    People above are using finding midpoints for sierpinski and Koch, I'd much more recommend copying shapes, scaling them, and then translating them to achieve the "fractal" effect. Pseudo-code in Java for sierpinski would look something like this:

    public ShapeObject transform(ShapeObject originalCurve)
        {
            Make a copy of the original curve
            Scale x and y to half of the original
            make a copy of the copied shape, and translate it to the right so it touches the first copied shape
            make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up
            Group the 3 new shapes into one
            return the new shape
        }
    
    0 讨论(0)
  • 2020-12-04 05:59

    You should indeed start with the Mandelbrot set, and understand what it really is.

    The idea behind it is relatively simple. You start with a function of complex variable

    f(z) = z2 + C

    where z is a complex variable and C is a complex constant. Now you iterate it starting from z = 0, i.e. you compute z1 = f(0), z2 = f(z1), z3 = f(z2) and so on. The set of those constants C for which the sequence z1, z2, z3, ... is bounded, i.e. it does not go to infinity, is the Mandelbrot set (the black set in the figure on the Wikipedia page).

    In practice, to draw the Mandelbrot set you should:

    • Choose a rectangle in the complex plane (say, from point -2-2i to point 2+2i).
    • Cover the rectangle with a suitable rectangular grid of points (say, 400x400 points), which will be mapped to pixels on your monitor.
    • For each point/pixel, let C be that point, compute, say, 20 terms of the corresponding iterated sequence z1, z2, z3, ... and check whether it "goes to infinity". In practice you can check, while iterating, if the absolute value of one of the 20 terms is greater than 2 (if one of the terms does, the subsequent terms are guaranteed to be unbounded). If some z_k does, the sequence "goes to infinity"; otherwise, you can consider it as bounded.
    • If the sequence corresponding to a certain point C is bounded, draw the corresponding pixel on the picture in black (for it belongs to the Mandelbrot set). Otherwise, draw it in another color. If you want to have fun and produce pretty plots, draw it in different colors depending on the magnitude of abs(20th term).

    The astounding fact about fractals is how we can obtain a tremendously complex set (in particular, the frontier of the Mandelbrot set) from easy and apparently innocuous requirements.

    Enjoy!

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