# FlowSnake

The flowsnake, also known as the 'Peano-Gosper' curve is a rather dashing space-filling curve. There is also a demonstration of it on the space-filling curves page.

The following implementation uses 'mutual recursion' - i.e. two methods that call each other.

The flowsnake has the important property that it tiles the plane. And it does it in a somewhat sexier fashion than the Hilbert curve, which, in turn, is somewhat sexier than the Peano curve.

Here's a definition of a snowflake.

;export flowsnake to flowsnake :count :length ifelse :count = 0 [ fd :length ] [ flowsnake (:count-1) :length lt 60 flowsnake_r (:count-1) :length lt 120 flowsnake_r (:count-1) :length rt 60 flowsnake (:count-1) :length rt 120 flowsnake (:count-1) :length flowsnake (:count-1) :length rt 60 flowsnake_r (:count-1) :length lt 60 ] end to flowsnake_r :count :length ifelse :count = 0 [ fd :length ] [ rt 60 flowsnake (:count-1) :length lt 60 flowsnake_r (:count-1) :length flowsnake_r (:count-1) :length lt 120 flowsnake_r (:count-1) :length lt 60 flowsnake (:count-1) :length rt 120 flowsnake (:count-1) :length rt 60 flowsnake_r (:count-1) :length] end

Let's see it in action.

;import flowsnake flowsnake 3 9

What if we draw a bunch of flowsnakes one after the other? We get a flowsnake chain.

;import flowsnake repeat 3 [flowsnake 3 9]

What if we turn a little bit in between each flowsnake?

;import flowsnake ;export multi_flow to multi_flow :repeat :angle :count :length repeat :repeat [ flowsnake :count :length rt :angle ] end

We get a daisy chain of snowflakes.

How much we turn dictates how many snowflakes we get. They join up neatly.

;import multi_flow flowsnake 4 3 setxy 300 100 multi_flow 2 0 3 3 setxy 495 80 multi_flow 3 120 3 3 setxy 650 80 multi_flow 4 90 3 3 setxy 150 240 multi_flow 5 72 3 3 setxy 350 240 multi_flow 6 60 3 3 setxy 580 240 multi_flow 7 (360/7) 3 3 setxy 850 240 multi_flow 8 (45) 3 3 setxy 200 450 multi_flow 9 (40) 3 3 setxy 500 450 multi_flow 10 (36) 3 3

So if you're making a list from most to least sexy of the three space-filling curves I've covered, it would go Peano-Gosper, Hilbert, Peano.

There's something satisfying about that list: Peano-Gosper, Hilbert, Peano. If you created an L-system where "Peano" -> "Peano-Gosper, Hilbert, Peano", then after a few iterations you'd have:

Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano-Gosper, Hilbert, Peano.

And soon I think you'd find a way to demonstrate that this can be represented as a Sierpinski triangle. Sierpinski triangles are just like that. Always Popping Up When You Least Expect It.

#Overlapping Flowsnakes

Something interesting happens when we deliberately overlap a bunch of Flowsnakes.

This is the picture we get when we draw 6 flowsnakes, and turn left 60 degrees instead of turning right 60 degrees.

;import multi_flow multi_flow 6 300 3 12

That central part of that pattern would make for a very nifty and irregular tile motif in the bathroom of a retirement village for mathematics professors.

Or if we combine two 'multi flowsnakes' in a different configuration...

;import multi_flow multi_flow 3 120 3 12 rt 60 multi_flow 3 120 3 12 rt 30

Other combinations are possible.

;import multi_flow multi_flow 3 120 3 9 rt 120 multi_flow 3 120 3 9 rt 120 multi_flow 3 120 3 9 rt 30

Now. What if we didn't draw the lines of a flow snake. But instead draw the vertices.

Here's a variation I created, along those lines, that would make a pretty good T-shirt.

to dott circle 1 end to dot circle 3 end to flowsnake :count :length ifelse :count = 0 [ pu color [250 0 0] fd :length pd ] [ flowsnake (:count-1) :length dot lt 60 flowsnake_r (:count-1) :length dot lt 120 flowsnake_r (:count-1) :length dot rt 60 flowsnake (:count-1) :length dot rt 120 flowsnake (:count-1) :length dot flowsnake (:count-1) :length dot rt 60 flowsnake_r (:count-1) :length dot lt 60 ] end to flowsnake_r :count :length ifelse :count = 0 [ pu color [0 0 250] fd :length pd ] [ rt 60 flowsnake (:count-1) :length dott lt 60 flowsnake_r (:count-1) :length dott flowsnake_r (:count-1) :length dott lt 120 flowsnake_r (:count-1) :length dott lt 60 flowsnake (:count-1) :length dott rt 120 flowsnake (:count-1) :length dott rt 60 flowsnake_r (:count-1) :length dott ] end flowsnake 4 9

For example: