Waschmaschine

© 1996 Christian Cohnen

The Waschmaschine (washing machine) is an unfinished Java applet from 1996 that was never completed. It implements a vortex/whirlpool texture distortion effect — unlike a standard RotoZoomer where every pixel rotates by the same angle, the Waschmaschine varies the rotation based on distance from the screen center, so pixels further from the center twist more, creating a spiral distortion.

The original applet used Java’s indexed-color MemoryImageSource with a 256-color palette. This JavaScript port has been transpiled to use the HTML5 Canvas API with true color rendering (24-bit RGB), producing much smoother gradients and richer color transitions than the original ever could.

The effect pre-computes polar coordinate tables (radius and angle for every pixel) and a sin/cos lookup table at startup. The render loop then only needs table lookups and integer math — no trigonometry per pixel.

Originally an unfinished Java applet (1996), transpiled to JavaScript/Canvas in 2026.

Features

Original Applet (unfinished)

The Java applet was never completed or published. The embed code would have been:

<applet archive="Waschmaschine.jar"
  code="Waschmaschine.class" width="320" height="200">
</applet>

JavaScript Canvas Version

The JavaScript port uses pre-computed polar coordinate tables and a sin/cos lookup table to achieve the vortex distortion without any trigonometry in the render loop.

<canvas id="game" width="320" height="200"></canvas>
<script src="waschmaschine.js"></script>

Configuration

Set CFG before loading the script to override defaults:

<script>
var CFG = {
  twistStrength: 6,   // max twist in PI radians
  twistSpeed: 0.015,  // oscillation speed
  scrollSpeed: 0.5,   // texture scroll speed
  radiusColor: 1.5,   // color ring density
  colorSpeed: 1,      // color cycling speed
  zoomBreath: 0.3,    // texture zoom amplitude
  imageZoom: 0.15,    // canvas zoom amplitude
  palette: "blue"     // blue | fire | ocean | gold
};
</script>
<script src="waschmaschine.js"></script>