### slip

This is a very simple idea (developed in 1989 on a sun4/110 using pixrect, Sun's first and last good graphics software), but it's quite effective because it's cheap to compute. It operates directly on the frame buffer via many blit operations. Each blit moves a rectangle of pixels (typically 20x20) by a small distance, usually just one pixel. The effect of these blits is to cause the pixels to flow, as if they were colored oil droplets suspended in swirling water.

But which of the eight one-pixel directions? There are several algorithms I've used for chosing the direction at each pixel. Each of these defines a flow-field:

• random. brownian motion.
• one of several fields defined by simple equations, eg spiral and eggbeaters.
• start with a grayscale image. Compute its gradient, then rotate the gradient 90 degrees. As the pixels swirl, eventually the original image becomes visible. Other transformations of the gradient would also probably be interesting...
There are many more possibilities. So far I have not tried time-dependent fields.

There is a slight difficulty in implementation: the flow-field generally contain non-integer values, but the blits are only one pixel. If the low-bits are just rounded-off the resulting flow-field is too coarse. The problem is essentially the same as dithering an image, and I adopted a solution from that domain: stochastic rounding. That is, instead of rounding 0.1 to 0 deterministically, there is a 90% chance (per pixel) 0.1 will be approximated with 0, and 10% chance with 1.

The above is a poisson update algorithm. I also have a synchronous implementation for high-quality animations. It uses a bresenham algorithm at each pixel, thus besides the delta vector provided by the flow-field per pixel per frame, each pixel maintains an error vector as state. Each frame the delta is added to the error (the deltas are normalizes so the largest delta is less than one). If pixel A's error vector strays into adjacent pixel B, then B's color is copied into A, and the error is reduced in that direction.

Finally, some additional blits are sometimes added to change the topology of the frame buffer from a square into torus.