teaching machines

Introducing Twoville

Some students and I are building a programming language for generating animated SVG images. Rather, each of us is building our own language, because each of us wanted 100% of the learning experience. By the end of the semester, we’ll have four different takes on how to build such a language.

My take is called Twoville. Its most interesting feature are time blocks. To say that rectangle r should be at position (0, 0) as time t advances past 15 seconds, we write:

15 -> t
  r.position = [0, 0]

Any statement in a time block has an effect only when the animation falls within the specified time interval.

We can also define the position as t approaches 30:

t -> 30
  r.position = [100, 100]

With both ends nailed down, the Twoville runtime will interpolate between the two values when the animation is in the [15, 30] time interval.

Tonight, after the close of SIGCSE 2018 and while imprisoned in my hotel room by the Baltimore drizzle, I was able to achieve my first animation goal in the language: rotating one square around another. Behold.

Here’s the Twoville code that produced this animation:

# Defaults
sun = rectangle()
sun.rgb = [1, 0.5, 0]
sun.position = [200, 200]
sun.size = [100, 100]

earth = rectangle()
earth.rgb = [1, 0.5, 0]
earth.size = [100, 100]

# Keyframes
0 -> t -> 10
  earth.position = [200, 100]
  earth.pivot = [300, 200]
0 -> t
  earth.rotation = 0
t -> 10
  earth.rotation = 180

10 -> t -> 20
  earth.position = [300, 200]
  earth.pivot = [300, 300]
10 -> t
  earth.rotation = 0
t -> 20
  earth.rotation = 180

20 -> t -> 30
  earth.position = [200, 300]
  earth.pivot = [200, 300]
20 -> t
  earth.rotation = 0
t -> 30
  earth.rotation = 180

30 -> t -> 40
  earth.position = [100, 200]
  earth.pivot = [200, 200]
30 -> t
  earth.rotation = 0
t -> 40
  earth.rotation = 180

The language doesn’t have loops yet. Once it does, I’ll be able to remove some of the redundancy.

Happy 0th birthday, Twoville!

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *