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.

It didn't go well.
What happened? I think the problem was that I had three unknown elements in this project:
- Simulation with the simplest rendering code I could get away with. Figure out what simulation rules are interesting and cool.
- Rendering isolines on a triangle mesh.
- Rendering curved isolines on a triangle mesh, using Bezier curves.
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: triangles
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
Thanks Monstrim!
Post a Comment