Around a month ago I had an idea in my head: a voronoi grid modified to have rounded cells that change in size. I made an attempt here for single cells changing size. The next step was to merge cells together, as I had done on this project. I decided that the way to demo this would be to simulate some kind of belief/cultural systems that spread over time across a map. I tried this here.

Screenshot of influence map experiment
Simulation

It didn't go well.

What happened? I think the problem was that I had three unknown elements in this project:

  1. Simulation with the simplest rendering code I could get away with. Figure out what simulation rules are interesting and cool.
  2. Rendering isolines on a triangle mesh.
    Isoline on triangle
  3. Rendering curved isolines on a triangle mesh, using Bezier curves.
    Bezier isoline on triangle

In trying to figure out all three at once, I didn't do a good job on them. I should have instead focused on one at a time. I ended up succeeding with #2 when I learned about and implemented the Meandering Triangles algorithm, and also built a little interactive visualization that helped me understand how the algorithm works. I failed with #1, having tried several algorithms but not finding one that I liked. I realized towards the end of the week that #1 was a red herring; I didn't need a simulation at all, as I really just wanted curved regions. I also failed at #3, having tried some experiments but never finding what I wanted, and also rejecting Chaikin Curves for reasons I can't remember. Since I really wanted the curved variable sized regions, I should have spent more time on #3 and less on #1. I ran out of time on this project so I'll leave #1 and #3 for another day.

You can see the animation I ended up with.

What do I mean “I ran out of time”? That's the next blog post!

Labels:

2 comments:

Monstrim wrote at November 19, 2019 1:01 PM

Regarding simulation, one thing I've always loved was to have a strange attractor underlying my animations (Lorenz being my go-to). That way, I always get some variation, and I won't settle into a stationary point.

In your case (various nodes), I can imagine implementing:
- each node has random fixed parameters, the simulation as a whole has a single attractor, and the A/B on each node are a function of that node's fixed parameters + the attractor's state (not very simulationey, but there should be some continuity between nodes)
- each node has its own attractor, completely independent of its neighbours (probably not ideal since no interaction between nodes)
- each node has its own attractor, but at each timestep you nudge that attractor's state a bit towards its neighbours' average (attractors will try to sync but will never be able to, on occasions when one of the state variables goes very high/low in one node you'll be able to see it pulling on its neighbours)

cheers

Amit wrote at November 20, 2019 8:47 AM

Thanks Monstrim!