2D Strange Attractors

Strange Attractors are plots of relatively simple formulas. They are created by repeating (or iterating) a formula over and over again and using the results at each iteration to plot a point. The result of each iteration is fed back into the equation. After millions of points have been plotted fractal structures appear. The repeated points fall within a basin of attraction (they are attracted to the points that make up these shapes).

I recently revisited my old strange attractor code in Visions of Chaos to add some new variations. This post will show many of the strange attractor formulas and some 4K resolution sample images they create. The images were created using over 1 billion points each. They have also been oversampled at least 3×3 pixels to reduce aliasing artifacts.

Clifford Attractor

Discovered by Clifford A Pickover. I found them explained on Paul Bourke‘s page here.


x and y both start at 0.1

xnew=sin(a*y)+c*cos(a*x)
ynew=sin(b*x)+d*cos(b*y)

Variables a,b,c and d are floating point values bewteen -3 and +3

Clifford Attractor

A=-1.7 B=1.3 C=-0.1 D=-1.21

Clifford Attractor

A=-1.7 B=1.8 C=-0.9 D=-0.4

Clifford Attractor

A=1.5 B=-1.8 C=1.6 D=2

Clifford Attractor

A=-2.239 B=-2.956 C=1.272 D=1.419

Clifford Attractor

A=-1.7 B=1.8 C=-1.9 D=-0.4

Fractal Dream Attractor

Discovered by Clifford A Pickover and discussed in his book “Chaos In Wonderland”.


x and y both start at 0.1

xnew=sin(y*b)+c*sin(x*b)
ynew=sin(x*a)+d*sin(y*a)

Variables a and b are floating point values bewteen -3 and +3
Variables c and d are floating point values between -0.5 and +1.5

Fractal Dream Attractor

A=-0.966918 B=2.879879 C=0.765145 D=0.744728

Fractal Dream Attractor

A=-2.9585 B=-2.2965 C=-2.8829 D=-0.1622

Fractal Dream Attractor

A=-2.8276 B=1.2813 C=1.9655 D=0.597

Fractal Dream Attractor

A=-1.1554 B=-2.3419 C=-1.9799 D=2.1828

Fractal Dream Attractor

A=-1.9956 B=-1.4528 C=-2.6206 D=0.8517

Gumowski-Mira Attractor

The Gumowski-Mira equation was developed in 1980 at CERN by I. Gumowski and C. Mira to calculate the trajectories of sub-atomic particles. It can also be used to create attractor images.


x and y both start at any floating point value between -20 and +20

t=x
xnew=b*y+w
w=a*x+(1-a)*2*x*x/(1+x*x)
ynew=w-t

The a and b parameters can be any floating point value between -1 and +1.

Gumowski Mira Attractor

Initial X=0 Initial Y=0.5 A=0.008 B=-0.7

Gumowski Mira Attractor

Initial X=-0.723135391715914 Initial Y=-0.327585775405169 A=0.79253300698474 B=0.345703079365194

Gumowski Mira Attractor

Initial X=-0.312847771216184 Initial Y=-0.710899183526635 A=0.579161538276821 B=-0.820410779677331

Gumowski Mira Attractor

Initial X=-0.325819793157279 Initial Y=0.48573582014069 A=0.062683217227459 B=-0.436713613104075

Gumowski Mira Attractor

Initial X=0.78662442881614 Initial Y=0.919355855789036 A=0.900278024375439 B=0.661233567167073

Hopalong Attractor

The Hopalong attractor was discovered by Barry Martin.


x and y both start at 0

xnew=y-1-sqrt(abs(b*x-1-c))*sign(x-1)
ynew=a-x-1

The parameters a, b and c can be any floating point value between 0 and +10.

Hopalong Attractor

A=7.16878197155893 B=8.43659746693447 C=2.55983412731439

Hopalong Attractor

A=7.7867514709942 B=0.132189802825451 C=8.14610984409228

Hopalong Attractor

A=9.74546888144687 B=1.56320227775723 C=7.86818214459345

Hopalong Attractor

A=9.8724800767377 B=8.66862616268918 C=8.66950439289212

Hopalong Attractor

A=9.7671244922094 B=4.10973468795419 C=3.78332691499963

Jason Rampe 1

A variation I discovered while trying random formula changes.


x and y both start at 0.1

xnew=cos(y*b)+c*sin(x*b)
ynew=cos(x*a)+d*sin(y*a)

Variables a, b, c and d are floating point values between -3 and +3

Jason Rampe 1 Attractor

A=2.6 B=-2.5995 C=-2.9007 D=0.3565

Jason Rampe 1 Attractor

A=1.8285 B=-1.8539 C=0.3816 D=1.9765

Jason Rampe 1 Attractor

A=2.5425 B=2.8358 C=-0.8721 D=2.7044

Jason Rampe 1 Attractor

A=-1.8669 B=1.2768 C=-2.9296 D=-0.4121

Jason Rampe 1 Attractor

A=-2.7918 B=2.1196 C=1.0284 D=0.1384

Jason Rampe 2

Another variation I discovered while trying random formula changes.


x and y both start at 0.1

xnew=cos(y*b)+c*cos(x*b)
ynew=cos(x*a)+d*cos(y*a)

Variables a, b, c and d are floating point values between -3 and +3

Jason Rampe 2 Attractor

A=1.546 B=1.929 C=1.09 D=1.41

Jason Rampe 2 Attractor

A=2.907 B=-1.9472 C=1.2833 D=1.3206

Jason Rampe 2 Attractor

A=0.8875 B=0.7821 C=-2.3262 D=1.5379

Jason Rampe 2 Attractor

A=-2.4121 B=-1.0028 C=-2.2386 D=0.274

Jason Rampe 2 Attractor

A=-2.9581 B=0.927 C=2.7842 D=0.6267

Jason Rampe 3

Yet another variation I discovered while trying random formula changes.


x and y both start at 0.1

xnew=sin(y*b)+c*cos(x*b)
ynew=cos(x*a)+d*sin(y*a)

Variables a, b, c and d are floating point values between -3 and +3

Jason Rampe 3 Attractor

A=2.0246 B=-1.323 C=-2.8151 D=0.2277

Jason Rampe 3 Attractor

A=1.4662 B=-2.3632 C=-0.4167 D=2.4162

Jason Rampe 3 Attractor

A=-2.7564 B=-1.8234 C=2.8514 D=-0.8745

Jason Rampe 3 Attractor

A=-2.218 B=1.4318 C=-0.3346 D=2.4993

Jason Rampe 3 Attractor

A=1.2418 B=-2.4174 C=-0.7112 D=-1.9802

Johnny Svensson Attractor

See here.


x and y both start at 0.1

xnew=d*sin(x*a)-sin(y*b)
ynew=c*cos(x*a)+cos(y*b)

Variables a, b, c and d are floating point values between -3 and +3

Johnny Svensson Attractor

A=1.40 B=1.56 C=1.40 D=-6.56

Johnny Svensson Attractor

A=-2.538 B=1.362 C=1.315 D=0.513

Johnny Svensson Attractor

A=1.913 B=2.796 C=1.468 D=1.01

Johnny Svensson Attractor

A=-2.337 B=-2.337 C=0.533 D=1.378

Johnny Svensson Attractor

A=-2.722 B=2.574 C=1.284 D=1.043

Peter DeJong Attractor

See here.


x and y both start at 0.1

xnew=sin(y*a)-cos(x*b)
ynew=sin(x*c)-cos(y*d)

Variables a, b, c and d are floating point values between -3 and +3

Peter DeJong Attractor

A=0.970 B=-1.899 C=1.381 D=-1.506

Peter DeJong Attractor

A=1.4 B=-2.3 C=2.4 D=-2.1

Peter DeJong Attractor

A=2.01 B=-2.53 C=1.61 D=-0.33

Peter DeJong Attractor

A=-2.7 B=-0.09 C=-0.86 D=-2.2

Peter DeJong Attractor

A=-0.827 B=-1.637 C=1.659 D=-0.943

Peter DeJong Attractor

A=-2 B=-2 C=-1.2 D=2

Peter DeJong Attractor

A=-0.709 B=1.638 C=0.452 D=1.740

Symmetric Icon Attractor

These attractors came from the book “Symmetry in Chaos” by Michael Field and Martin Golubitsky. They give symmetric results to the attractors formed.


x and y both start at 0.01

zzbar=sqr(x)+sqr(y)
p=alpha*zzbar+lambda
zreal=x
zimag=y
for i=1 to degree-2 do
begin
     za=zreal*x-zimag*y
     zb=zimag*x+zreal*y
     zreal=za
     zimag=zb
end
zn=x*zreal-y*zimag
p=p+beta*zn
xnew=p*x+gamma*zreal-omega*y
ynew=p*y-gamma*zimag+omega*x
x=xnew
y=ynew

The Lambda, Alpha, Beta, Gamma, Omega and Degree parameters can be changed to create new plot shapes.

These sample images all come from paramters in the “Symmetry in Chaos” book.

Symmetric Icon - Chaotic Flower

L=-2.5 A=5 B=-1.9 G=1 O=0.188 D=5

Symmetric Icon - Clam Triple

L=1.56 A=-1 B=0.1 G=-0.82 O=0.12 D=3

Symmetric Icon - Emporer's Cloak

L=-1.806 A=1.806 B=0 G=1 O=0 D=5

Symmetric Icon - Fish and Eye

L=-2.195 A=10 B=-12 G=1 O=0 D=3

Symmetric Icon - Flintstone

L=2.5 A=-2.5 B=0 G=0.9 O=0 D=3

Symmetric Icon - French Glass

L=-2.05 A=3 B=-16.79 G=1 O=0 D=9

Symmetric Icon - Halloween

L=-2.7 A=5 B=1.5 G=1.0 O=0 D=6

Symmetric Icon - Kachina Dolls

L=2.409 A=-2.5 B=0 G=0.9 O=0 D=23

Symmetric Icon - Mayan Bracelet

L=-2.08 A=1 B=-0.1 G=0.167 O=0 D=7

Symmetric Icon - Pentacle

L=-2.32 A=2.32 B=0 G=0.75 O=0 D=5

Symmetric Icon - Pentagon

L=2.6 A=-2 B=0 G=-0.5 O=0 D=5

Symmetric Icon - Sanddollar

L=-2.34 A=2 B=0.2 G=0.1 O=0 D=5

Symmetric Icon - Swirling Streamers

L=-1.86 A=2 B=0 G=1 O=0.1 D=4

Symmetric Icon - Trampoline

L=1.56 A=-1 B=0.1 G=-0.82 O=0 D=3

Symmetric Icon - Trinity

L=1.5 A=-1 B=0.1 G=-0.805 O=0 D=3

Symmetric Icon - Untitled 01

L=1.455 A=-1 B=0.03 G=-0.8 O=0 D=3

Symmetric Icon - Unititled 02

L=2.39 A=-2.5 B=-0.1 G=0.9 O=-0.15 D=16

3D Alternatives

Strange Attractors can also be extended into three dimensions. See here and here for my previous experiments with 3D Strange Attractors.

All of the images in this post were created using Visions of Chaos.

Jason.

Fractal Spirographs

Inspiration

Daniel Shiffman has been making YouTube movies for some time now. His videos focus on programming and include coding challenges in which he writes code for a target idea from scratch. If you are a coder I recommend Dan’s videos for entertainment and inspiration.

His latest live stream focused on Fractal Spirographs.

If you prefer to watch a shorter edited version, here it is.

He was inspired by the following image from the Benice Equation blog.

Fractal Spirograph

Fractal Spirographs (aka Fractal Routlette) are generated by tracking a series (or chain) of circles rotating around each other as shown in the above gif animation. You track the chain of 10 or so circles and plot the path the final smallest circle takes. Changing the number of circles, the size ratio between circles, the speed of angle change, and the constant “k” changes the resulting plots and images.

How I Coded It

As I watched Daniel’s video I coded my own version. For my code (Delphi/pascal) I used a dynamic array of records to hold the details of each circle/orbit. This seemed the simplest approach to me for keeping track of a list of the linked circles.

  
type orbit=record
     x,y:double;
     radius:double;
     angle:double;
     speed:double;
end;

Before the main loop you fill the array;

     
//parent orbit
orbits[0].x:=destimage.width/2;
orbits[0].y:=min(destimage.width,destimage.height)/2;
orbits[0].radius:=orbits[0].y/2.5;
orbits[0].angle:=0;
orbits[0].speed:=0;
rsum:=orbits[0].radius;
//children orbits
for loop:=1 to numorbits-1 do
begin
     newr:=orbits[loop-1].radius/orbitsizeratio;
     newx:=orbits[loop-1].x+orbits[loop-1].radius+newr;
     newy:=orbits[loop-1].y;
     orbits[loop].x:=newx;
     orbits[loop].y:=newy;
     orbits[loop].radius:=newr;
     orbits[loop].angle:=orbits[loop-1].angle;
     orbits[loop].speed:=power(k,loop-1)/sqr(k*k);
end;

Then inside the main loop, you update the orbits;


//update orbits
for loop:=1 to numorbits-1 do
begin
     orbits[loop].angle:=orbits[loop].angle+orbits[loop].speed;
     rsum:=orbits[loop-1].radius+orbits[loop].radius;
     orbits[loop].x:=orbits[loop-1].x+rsum*cos(orbits[loop].angle*pi/180);
     orbits[loop].y:=orbits[loop-1].y+rsum*sin(orbits[loop].angle*pi/180);
end;

and then you use the last orbit positions to plot the line, ie


canvas.lineto(round(orbits[numorbits-1].x),round(orbits[numorbits-1].y));

Results

Once the code was working I rendered the following images and movie. They are all 4K resolution to see the details. Click the images to see them full size.

Fractal Spirograph

Fractal Spirograph

Fractal Spirograph

Fractal Spirograph

Fractal Spirograph

Here is a 4K movie showing how these curves are built up.

Fractal Spirographs are now included with the latest version of Visions of Chaos.

Finally, here is an 8K Fulldome 8192×8192 pixel resolution image. Must be seen full size to see the fine detailed plot line.

Fractal Spirograph

To Do

Experiment with more changes in the circle sizes. The original blog post links to another 4 posts here, here, here and here and even this sumo wrestler

Fractal Spirograph

Plenty of inspiration for future enhancements.

I have already experimented with 3D Spirographs in the past, but they are using spheres rotating within other spheres. Plotting the sqheres rotating around the outside of other spheres should give more new unique results.

Jason.

The Burning Ship Fractal

The Burning Ship Fractal is a slight variant on the Mandelbrot Set Fractal.

The basic Mandelbrot Fractal formula is z=z^2+c. The Burning Ship Fractal formula is z=abs(z)^2+c.

The following image is the standard power 2 Burning Ship Fractal rendered using CPM smooth coloring.

Burning Ship Fractal

Zooming in to the right antenna part of the fractal shows why it was named the Burning Ship.

Burning Ship Fractal

The next 3 images change the exponent 2 in z=abs(z)^2+c to 3, 4 and 5.

Burning Ship Fractal

Burning Ship Fractal

Burning Ship Fractal

The same power 2 through power 5 Burning Ships but this time using Triangle Inequality Average (TIA) coloring

Burning Ship Fractal

Burning Ship Fractal

Burning Ship Fractal

Burning Ship Fractal

The next 4K resolution movie shows a series of zooms into Burning Ship Fractals between power 2 and power 5 colored using CPM coloring

and finally another 4K movie showing more Burning Ship zooms colored using TIA coloring

All of the above images and movies were created with Visions of Chaos.

Jason.

Meta-Mandelbrots

Ian McDonald came up with a new novel way to render Mandelbrot (actually Julia) Set fractals.

The usual Mandelbrot fomula is
z=z*z+c

Taking the z*z+c part, replace the z’s with (z*z+c) and replace the c’s with (c*c+z)

After one level of replacement you get
((z*z+c)*(z*z+c)+(c*c+z))

Level 2 is
(((z*z+c)*(z*z+c)+(c*c+z)) * ((z*z+c)*(z*z+c)+(c*c+z)) + ((c*c+z)*(c*c+z)+(z*z+c)))

and Level 3 is
((((z*z+c)*(z*z+c)+(c*c+z))*((z*z+c)*(z*z+c)+(c*c+z))+((c*c+z)*(c*c+z)+(z*z+c)))*(((z*z+c)*(z*z+c)+(c*c+z))*((z*z+c)*(z*z+c)+(c*c+z))+((c*c+z)*(c*c+z)+(z*z+c)))+(((c*c+z)*(c*c+z)+(z*z+c))*((c*c+z)*(c*c+z)+(z*z+c))+((z*z+c)*(z*z+c)+(c*c+z))))

Then you use the level 3 formula and render it as a Julia Set.

Complex C (-0.2,0.0)

Meta-Mandelbrot

Complex C (-0.14 0.0)

Meta-Mandelbrot

Complex C (-0.141 0.0)

Meta-Mandelbrot

The following movie shows the complex C changing slowly from 0 to -0.2 and three zooms into Meta-Mandelbrots. Unfortunately because these are Julia sets the shapes deeper in are virtually identical to the original fractal. You don’t get those totally different looking areas as you do with Mandelbrot fractals.

For more information see the original Fractal Forums post here.

The GLSL shader to generate these fractals is now included with Visions of Chaos.

The Belousov-Zhabotinsky Reaction and The Hodgepodge Machine

Inspiration for this post

The other day I saw this YouTube video of a Belousov-Zhabotinsky Cellular Automaton (BZ CA) by John BitSavage

After a while of running in an oscillating state it begins to grow cell like structures. I had never seen this in BZ CAs before. I have seen similar cell like growths in Digital Inkblot CAs and in the Yin Yang Fire CA. Seeing John’s results different to the usual BZ CA was what got me back into researching BZ in more depth.

The Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reactions (see here for more info) are examples of a chemical reactions that can oscillate between two different states and form intetesting patterns when performed in shallow petri dishes.

Here are some sample high res images of real BZ reaction by Stephen Morris. Click for full size.

Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reaction

and some other images from around the Internet

Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reaction

Belousov-Zhabotinsky Reaction

and some sample movies I found on YouTube

The Hodgepodge Machine Cellular Automaton

Back in August 1988, Scientific American‘s Computer Recreations section had an article by A. K. Dewdney named “The hodgepodge machine makes waves”. After a fair bit of hunting around I could not find any copies of the article online so I ended up paying $8 USD to get the issue in PDF format. The PDF is a high quality version of the issue, but $8 is still a rip off.

In the article Dewdney describes the “hodgepodge machine” cellular automaton designed by Martin Gerhardt and Heike Schuster of the University of Bielefeld in West Germany. A copy of their original paper can be seen here.

How the Hodgepodge Machine works

The inidividual cells/pixels in the hodgepodge automaton have n+1 states (between 0 and n). Cells at state 0 are considered “healthy” and cells at the maximum state n are said to be “ill”. All cells with states inbetween 0 and n are “infected” with the larger the state representing the greater level of infection.

Each cycle of the cellular automaton a series of rules are applied to each cell depending on its state.

(a) If the cell is healthy (i.e., in state 0) then its new state is [a/k1] + [b/k2], where a is the number of infected cells among its eight neighbors, b is the number of ill cells among its neighbors, and k1 and k2 are constants. Here “[]” means the integer part of the number enclosed, so that, for example, [7/3] = [2+1/3] = 2.

(b) If the cell is ill (i.e., in state n) then it miraculously becomes healthy (i.e., its state becomes 0).

(c) If the cell is infected (i.e., in a state other than 0 and n) then its new state is [s/(a+b+1)] + g, where a and b are as above, s is the sum of the states of the cell and of its neighbors and g is a constant.

The parameters given for these CA are usual q (for max states), k1 and k2 (the above constants) and g (which is a constant for how quickly the infection tends to spread).

My previous limited history experimenting with BZ

Years ago I implemented BZ CA in Visions of Chaos (I have now correctly renamed the mode Hodgepodge Machine) and got the following result. This resolution used to be considered the norm for YouTube and looked OK on lower resolution screens. How times have changed.

The above run used these parameters
q=200
k1=3
k2=3
g=28

Replicating Gerhardt and Miner’s results

Gerhadt and Miner used fixed values of k1=2 and k2=3. The majority of their experiments used a grid size of q=20 (ie only 20×20 cells) without a wraparound toroidal world. This leaves the single infection spreading g variable to play with. Their paper states they used values of g between 1 and 10, but I get no spirals with g in that range.

Here are a few samples which are 512×512 sized grids with wraparound edges and many thousands of generations to be sure they had finally settled down. Each cell is 2×2 pixels in size so they are 1024×1024 images.

Hodgepodge Machine

q=100, k1=2, k2=3, g=5

Hodgepodge Machine

q=100, k1=2, k2=3, g=20

Hodgepodge Machine

q=100, k1=2, k2=3, g=25

Hodgepodge Machine

q=100, k1=2, k2=3, g=30

Results from other parameters

Hodgepodge Machine

q=100, k1=3, k2=3, g=10

Hodgepodge Machine

q=100, k1=3, k2=3, g=15

Hodgepodge Machine

q=100, k1=3, k2=3, g=20

Extending into 3D

The next logical step was extending it into three dimensions. This blog post from Rudy Rucker shows a 3D BZ CA from Harry Fu back in 2004 for his Master’s degree writing project. I must be a nerd as I whipped up my 3D version over two afternoons. Surprisingly there are no other references to experiments with 3D Hodgepodge that I can find.

The algorithms are almost identical to their 2D counterparts. The Moore neighborhood is extended into three dimensions (so 26 neighbors rather than 8 in the 2D version). It is difficult to see the internal structures as they are hidden from view. Methods I have used to try and see more of the internals are to slice out 1/8th of the cubes and to render only some of the states.

Clicking these sample images will show them in 4K resolution.

3D Hodgepodge Machine

q=100, k1=1, k2=18, g=43 (150x150x150 grid)

3D Hodgepodge Machine

q=100, k1=1, k2=18, g=43 (150x150x150 grid – same as previous with a 1/8th slice out to see the same patterns are extending through the 3D structure)

3D Hodgepodge Machine

q=100, k1=1, k2=18, g=43 (150x150x150 grid – same rules again, but this time with only state 0 to state 50 cells being shown)

3D Hodgepodge Machine

q=100, k1=2, k2=3, g=15 (150x150x150 grid)

3D Hodgepodge Machine

q=100, k1=3, k2=6, g=31 (150x150x150 grid)

3D Hodgepodge Machine

q=100, k1=4, k2=6, g=10 (150x150x150 grid)

3D Hodgepodge Machine

q=100, k1=4, k2=6, g=10 (150x150x150 grid – same rules as the previous image – without the 1/8th slice – with only states 70 to 100 visible)

3D Hodgepodge Machine

q=100, k1=3, k2=31, g=43 (250x250x250 sized grid – 15,625,000 total cells)

3D Hodgepodge Machine

q=100, k1=4, k2=12, g=34 (350x350x350 sized grid – 42,875,000 total cells)

3D Hodgepodge Machine

q=100, k1=1, k2=9, g=36 (400x400x400 sized grid – 64,000,000 total cells)

Download Visions of Chaos if you would like to experiment with both 2D and 3D Hodgepodge Machine cellular automata. If you find any interesting rules please let know in the comments or via email.

Eroding Fractal Terrains with Virtual Raindrops

A long while back I added a very simplistic fractal terrain simulator to Visions of Chaos. I had an idea to try and add erosion simulation into the existing code to get some more realistic terrain shapes.

Generating the inital terrain

There are many ways to generate a terrain height array. For the terrain in this post I am using Perlin noise.

This is the 2D Perlin Noise image…

Fractal Terrain

…that is extruded to the following 3d terrain…

Fractal Terrain

An alternative method is to use 1/f Perlin Noise that creates this type of heightmap…

Fractal Terrain

..and this 3D terrain.

Fractal Terrain

Simulating erosion

Rather than try and replicate some of the much more complex simulators out there for wind and rain erosion (see for example here, here and here) I experimented with the simplest version I could come up with.

1. Take a single virtual rain drop and drop it to a random location on the terrain grid. Keep track of a totalsoil amount which starts at 0 when the drop is first dropped onto the terrain.
2. Look at its immediate 8 neighbors and find the lowest neighbor.
3. If no neighbors are lower deposit the remaining total soil carried and stop. This lead to large spikes as the totalsoil was too much. I since changed the drop rate to the same as the fixed depositrate. Technically this removes soil from the system, but the results are more realistic looking terrain.
4. Pick up a bit of the soil from the current spot (lower the terrain array at this point).

soilamount:=slope*erosionrate;
totalsoil:=totalsoil+soilamount;
heightarray[wx,wy]:=max(heightarray[wx,wy]-soilamount,0);

5. Move to the lowest neighbor point.
6. Deposit a bit of the carried soil at this location.

deposit:=soilamount*depositrate/slope;
heightarray[lx,ly]:=heightarray[lx,ly]+deposit;
totalsoil:=max(totalsoil-deposit,0);

7. Goto 1.

Repeat this for millions of drops.

The erosion and deposit steps (4 and 6 above) simulate the water flowing down hill, picking up and depositing soil as it goes.

To add some wind erosion you can smooth the height array every few thousand rain drops. I use a simple convolution blur every 5000 rain drops. This smooths the terrain out a little bit and can be thought of as wind smoothing the jagged edges of the terrain down a bit.

Erosion Movie

Here is a sample movie of the erosion process. This is a 13,500 frame 4K resolution movie. Each frame covers 10,000 virtual raindrops being dropped. This took days to render. 99% of the time is rendering the mesh with OpenGL. Simulating the raindrops is very fast.

and here are screenshots of every 2000th frame to show the erosion details more clearly.

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Fractal Terrain

Future ideas

The above is really just a quick experiment and I would like to spend more time on the more serious simulations of terrain generation and erosion. I have the book Texturing and Modeling, A Procedural Approach on my bookshelf and it contains many other terrain ideas.

Jason.

Cell Conquest

After seeing SuperCoquillette’s post on r/cellular_automata (and his online version here) I had to have a go at experimenting with it myself. It reminded me immediately of a more advanced version of Wa-Tor.

I spent a few hours getting my own version going and doing some high res test runs. The example images in this post are all 4K size. Click the thumbnails to see them full size.

The basic setup includes four “factions” that use the same settings, ie

Cell Conquest

This sequence started from a block of 4 squares of factions in the middle of the screen and grew outwards from there. None of the cells die once born.

Cell Conquest

Cell Conquest

Cell Conquest

Cell Conquest

Cell Conquest

Cell Conquest

Cell Conquest

And finally after approximately 27,000 steps when my hard drive filled up and crashed the program when it could not save any more frames.

Cell Conquest

Here is the same setup settings started from a random soup of factions with single pixel sized cells after running for a few thousand steps. There is some clumping of factions.

Cell Conquest

There seems to also be a bias to later factions in the method used in the source code. The factions are processed in order (first faction 1, then 2, etc). This is OK when each faction is surrounded by empty space, but breaks down once factions meet. This means that (for example) faction 1 may fight and take over a faction 4 location, but then once the faction 4 cells are processed the same cell may be taken back negating the original win. Overall this leads to the later factions being given a slight bias to spread faster and further than earlier factions. Or maybe it is just my version of the source code. I need to think about this some more and make sure the moving/fighting is fair.

Here are a few other color methods I experimented with. Firstly, average each cell color from which factions have visited. Cells are 10×10 pixels this time.

Cell Conquest

And the same, but with histogram equalization to get a wider range of colors.

Cell Conquest

Different faction colors and 5×5 sized cells.

Cell Conquest

I have added Cell Conquest as a new mode in the latest version of Visions of Chaos.

Jason.