Sin patria ni banderas, ahora vivo a mi manera; y es que me siento extranjero fuera de tus agujeros (Tercer movimiento: Lo de dentro, Extremoduro)
The technique I experimented with in this post is an endless source to obtain amazing images. It is called reaction-diffusion and simulates the evolution of a system where several substances interact chemically transforming into each other (reaction) and spreading out over a surface in space (diffusion). In my case there are just two substances in a 2D space and the evolution of system is simulated using the Gray-Scott algorithm which is ruled by several parameters that, once determined, can produce images like this one:
This article by Karl Sims, is a very clear and comprehensive explanation of the Gray-Scott algorithm. Briefly, the Gray-Scott model simulates the evolution of two substances, A and B in a two dimensional grid. In each cell of the grid, the substance A is added at a given feed rate f
. Then, both substances react following this rule: two particles of B convert a particle of A into a particle of B. To prevent overpopulation, B particles are killed at a given kill rate k
. In the diffusion phase, both substances spread out accross the cells of the grid at a given diffusion rates Da
and Db
. The diffusion is performed using a 2D Lapacian operator with a 3x3
convolution matrix L
.
In the article you can find the equations that rule the system, which depend on the parameters described in the previous paragraph. To obtain all the images of this post, I maintained most of them always constant and just changed the following:
- Feed and kill rates (
f
andk
respectively) - The initial proportion of both substances A and B. I always started with A=0 in each cell and B=1 in some (small) amount of them selected randomly or according to some geometrical considerations (and inner circle or square, for example). I let you to try with your own ideas.
Sometimes the system converges and remains stable after a number of iterations. For example, these images are obtained iterating 5000 times:
Before converging you can obtain also nice patterns in between:
The variety of patterns is amazing: tessellations, lattices, caleidoscopic … some more examples:
I used again Rcpp
to iterate efficiently but now I tried RcppArmadillo
, a C++
library for linear algebra and scientific computing because it contains a class called cube, which is a 3D matrix that fits perfectly into a 2D grid where the 3rd dimension is the amount of particles A and B.
I like to share my code because I think it may serve as a source of inspiration to someone. You can find the code here with just one of the many configurations I tried to generate the previous images. It may serve you as a good starting point to explore you own ones. Let me know if you reach interesting places.
Happy New Year 2020.
#Load in libraries
library(Rcpp) #to iterate fast
# Import C++ code
sourceCpp(‘cpp_funcs.cpp’) ####FAILING CODE
Why fails? May you copy the log or clarify the error a bit more? Thanks!
I would love the R code.
Surely this will inspire something…
Thank you!
Very good. I’ve done an animation: https://thumbs.gfycat.com/SeveralIncomparableChupacabra-size_restricted.gif
Nice! Thank you!
Muy interesante
Muchas gracias 🙂
Hi,
I love your code and i would like a “lazy” R function to see inside what the params DA, DB, f, and k are actually doing. But nevertheless, i had fun with your code, and i will continue to explore it. Thanks so much for sharing it. I hope you are well, take care, Monica
https://scontent-iad3-1.xx.fbcdn.net/v/t1.0-9/94814664_10217216098582239_9004564580067704832_n.jpg?_nc_cat=107&_nc_sid=8024bb&_nc_ohc=KIElIFHaLJgAX_oAge5&_nc_ht=scontent-iad3-1.xx&oh=d5fba3d56eab1efcdd3c0590f89d8a00&oe=5ECB240A
Thanks a lot Monica 🙂