The Chaos Game: an experiment about fractals, recursivity and creative coding
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Mathematics, rightly viewed, possesses not only truth, but supreme beauty (Bertrand Russell)
You have a pentagon defined by its five vertex. Now, follow these steps:
- Step 0: take a point inside the pentagon (it can be its center if you want to do it easy). Keep this point in a safe place.
- Step 1: choose a vertex randomly and take the midpoint between both of them (the vertex and the original point). Keep also this new point. Repeat Step 1 one more time.
- Step 2: compare the last two vertex that you have chosen. If they are the same, choose another with this condition: if it’s not a neighbor of the last vertex you chose, keep it. If it is a neighbor, choose another vertex randomly until you choose a not-neighbor one. Then, take the midpoint between the last point you obtained and this new vertex. Keep also this new point.
- Step 3: Repeat Step 2 a number of times and after that, do a plot with the set of points that you obtained.
If you repeat these steps 10 milion times, you will obtain this stunning image:
I love the incredible ability of maths to create beauty. More concretely, I love the fact of how repeating extremely simple operations can bring you to unexpected places. Would you expect that the image created with the initial naive algorithm would be that? I wouldn’t. Even knowing the result I cannot imagine how those simple steps can produce it.
The image generated by all the points repeat itself at different scales. This characteristic, called self-similarity, is property of fractals and make them extremely attractive. Step 2 is the key one to define the shape of the image. Apart of comparing two previous vertex as it’s defined in the algorithm above, I implemented two other versions:
- one version where the currently chosen vertex cannot be the same as the previously chosen vertex.
- another one where the currently chosen vertex cannot neighbor the previously chosen vertex if the three previously chosen vertices are the same (note that this implementation is the same as the original but comparing with three previous vertex instead two).
These images are the result of applying the three versions of the algorithm to a square, a pentagon, a hexagon and a heptagon (a row for each polygon and a column for each algorithm):
From a technical point of view I used Rcpp
to generate the set of points. Since each iteration depends on the previous one, the loop cannot easily vectorised and C++ is a perfect option to avoid the bottleneck if you use another technique to iterate. In this case, instead of writing the C++ directly inside the R
file with cppFunction()
, I used a stand-alone C++ file called chaos_funcs.cpp
to write the C++ code that I load into R using sourceCpp()
.
Some days ago, I gave a tutorial at the coding club of the University Carlos III in Madrid where we worked with the integration of C++ and R to create beautiful images of strange attractors. The tutorial and the code we developed is here. You can also find the code of this experiment here. Enjoy!
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.