Caustics (wikipedia) are luminous patterns which are resulting from the superposition of smoothly deviated light rays. It is the heart-shaped pattern in your cup of coffee which is formed as the rays of from the sun are reflected on the cup’s surface. It is also the wiggly patterns of light that you will see on the floor of a pool as the sun’s light is refracted at the surface of the water. Here we will simulate this particular physical phenomenon. Simply because they are mesmerizingly beautiful, but also as it is of interest in visual neuroscience. Indeed, it speaks to how images are formed (more on this later), hence how the brain may understand images.
In this post, I have developed a simple formalism to generate such patterns, with the paradoxical result that it is very simple to code yet generates patterns with great complexity, such as:
This is joint work with artist Etienne Rey, in which I especially follow the ideas put forward in the series Turbulence.
Upon further observation, one may discover that caustics exhibit some iridescence$^\ddagger$, that is, that the light pattern which forms the waggling lines of the caustics may decompose into different colors, forming evanescent rainbows. Here, we will simply use a modulation of the Snell-Descartes law that we used to compute different angle of refraction. This will be put in relation with the dependance of the refraction index with the wavelength of light and the transformation of a monochromatic light into RGB that we used in a previous post about colors of the sky. The results are close to subjective observations, with the surprising (to me) observation that colors appear more between nodes…
Note: $\ddagger$ I use the term iridescence which is improper in the physical sense as it rather concerns the property of an object to exhibit different colors depending on the angle of view. However, in the perspective of the work with Etienne Rey it resonates with our endeavour to show that percepetion, in particular visual perception, is an active process of the observer within its environment.
Install dependencies, then this library:
python3 -m pip install -r requirements.txt
python3 -m pip install -e .
from caustique import init
opt = init()
opt.bin_dens = 8
from caustique import Caustique
c = Caustique(opt)
z = c.wave()
gifname = c.plot(z)
Launch jupyter and open the notebook.