Nathaniel Bowditch, 1815 · Jules Lissajous, 1857
x(u) = A·sin(a·u + δ) y(u) = B·sin(b·u)
Two perpendicular sinusoids plotted against each other. When a and b are small whole-number ratios the path closes into a standing knot; irrational ratios never close and fill the box. Bowditch found them with a compound pendulum forty years before Lissajous found them with mirrors and a tuning fork.
HOUDINI · VEX — paste into a Detail Wrangle
// FORMA — PL. 01 · LISSAJOUS FIGURE — Nathaniel Bowditch, 1815 · Jules Lissajous, 1857
// x(u) = A·sin(a·u + δ)
// y(u) = B·sin(b·u)
// Paste into a Detail Wrangle (Run Over: Detail), no inputs needed.
// Written from the published mathematics, not adapted from any code.
// Defaults are the published values; comments give the measured live range.
// https://forma-gen.com/#plate=lissajous
float p_a = 3; // 1 .. 12 · a — horizontal frequency
float p_b = 4; // 1 .. 12 · b — vertical frequency
float p_delta = 0.6; // 0 .. 3.14 · δ — phase offset
// The plate's own colour: FORMA's CURVES accent as a cosine ramp,
// brightest near t = 0 and t = 1, near-black around t = 0.5.
vector forma_ramp(float t){
return set(
0.11 + 0.1196 * cos(6.28318530718 * (t + 0)),
0.46 + 0.5 * cos(6.28318530718 * (t + 0.05)),
0.2453 + 0.2667 * cos(6.28318530718 * (t + 0.1)));
}
// One closed period of the figure: u over 2π at unit amplitude. Integer
// frequencies close the curve; the phase δ tilts it out of degeneracy.
int forma_n = 1600;
float TAU = 6.28318530718;
int prim = addprim(0, "polyline");
for (int i = 0; i <= forma_n; i++){
float u = float(i) / float(forma_n) * TAU;
// canvas y runs down; negated so the figure sits as the plate shows it
int pt = addpoint(0, set(sin(p_a * u + p_delta), -sin(p_b * u), 0.0));
// colour sweeps the bright lobe of the ramp along the curve
float uu = float(i) / float(forma_n);
setpointattrib(0, "Cd", pt, forma_ramp(0.8 + 0.3 * uu));
addvertex(0, prim, pt);
}