Imagine a straight wire. Bend this wire until its ends meet. You get a ring. Next stage.
Take another straight wire, bend it as before, but this time, don’t let the ends meet, instead continue bending the wire more and more, until you get a spring. Now, Think of this spring as the first wire, and bend it until the spring’s ends meet. We get a spring-ring. (See pictures below)
At this point it should be obvious – instead of making the ends of the spring meet, we can continue bending the spring into a meta-spring, and again make this meta-spring’s ends meet. Rinse and repeat ad-infinitum.
At first I had a hard time picturing it, and I thought it would be tough to write about it without drawing it. So I set with pen and paper, and tried to draw it. That was even harder than picturing it. So I thought I could write a script to draw it, and that turned out to be pretty easy.
Here are the first four stages. The second and third are shown from the side. Click for bigger versions.
To implement this, I wrote a function that draws any track. A track is defined to be a function takes a float argument between 0 and 1, and returns the appropriate 3d point in between, where 0 is one end of the track and 1 is the other. (Actually, I also decided that tracks should return a “right hand” vector as well). Then I wrote a ring:
def ring(t): pi = math.pi cos = math.cos sin = math.sin x = numpy.array((2*cos(2*pi*t),2*sin(2*pi*t),0)) return (x,-x/3) |
Lastly I wrote a wrapper function, that takes any track, and springifies it. It was called springify_track. At this point I could do this:
(The constants are the radius of the spring loops, the sampling delta, and the number loops.)
t1 = ring t2 = springify_track(t1, 0.25, 0.1, 50) t3 = springify_track(t2, 0.06, 0.0011, 5000) t4 = springify_track(t3, 0.011, 0.000012, 500000) |
That’s pretty cool. But why not include the code?
Thanks. I didn’t include the code because I want to do something with it in the next post. I thought of a really nice challenge.
Besides that, code that you write at 3 am isn’t publication material (at least not yet:)