An audio-visual pseudo-physical simulation of colliding circles.
Originally implemented in Haskell using SuperCollider3 in 2010, ported to C and extended in 2023: blog post.
# 1 Examples
Ten video files on archive.org.
# 2 Notes
The world is a collection of N circles which each move at a constant speed in a straight line (in the absence of collisions). Given two such circles it is possible to calculate the precise time of their next collision. For N circles, O(N2) such “next” collisions may occur.
Pick the soonest next collision between circles A and B. This collision will change the velocities of A and B, but no other circle. Update the collection of collisions, by removing all the other “next” collisions involving either A or B, and computing the new collisions of A and B with all the other circles (O(N) collisions). For maintaining a consistent time-base for all circles in the world, it makes sense to advance in a straight line each circle to its position at the time of the collision.
Given a world at time T, to find the world at time T+dT simply step through the future collisions one by one until the soonest collision is after T+dT, at which point one can just advance the circles in straight lines to T+dT.
T T+1 T+2 T+3 T+4 T+5 T+6 T+7 ... | | | | | | | | ... ----*---*---*---------*---------------**-*--*-*-------*------*--
Care needs to be taken in case of numerical imprecision: one can get an infinite number of collisions without time increasing.
# 3 Todo
adjustable audio/video offset for synchronisation
don’t hard-code 60fps display
web browser based version using Emscripten
for exhibition installation using an old laptop:
disable keyboard input (apart from power button)
disable trackpad input
disable magic SysRq key
shut down when mains power unplugged to preserve battery
for exhibition installation using a Raspberry Pi:
use TV/composite analogue A/V out to a 4:3 CRT
may require aspect ratio tweaks to ensure circles are circular
# 4 Code
git clone https://code.mathr.co.uk/bowntz.git
# 4.1 C Version
bowntz.c is the current C version (2023).
make, run like
Command line arguments:
--seed=42set pseudo-random number generator seed.
--record=1render a video.
--fs=1start in fullscreen mode, toggle with F or F11 keys.
Close window or press Q or ESCAPE keys to quit (not operational when record mode is active).
# 4.2 Haskell Version
bowntz.hs is the original Haskell version (2010),
which may be hard to get working as Haskell ecosystem changes fast.
Build with the
To run you need to start SuperCollider3 first:
$ scsynth -u 57110 & -- wait for scsynth to start, connect its JACK ports -- $ ./bowntz
Bowntz requires a “clean” SC3 server to be running on its usual port. Bowntz leaves this SC3 server in an “unclean” state when it exits.
# 4.3 Legal
Source code is licensed under AGPL-v3-only.
Output is licensed under CC BY-NC-SA.