Straight lines pretending to be flowers

Mar 26, 2026 · Microblog #24

A Maurer rose cycles through curated (n, d) pairs. Move your mouse to explore the parameter space manually; double-click to return to auto mode.

In 1987, Peter M. Maurer published a short paper called "A Rose is a Rose..." in The American Mathematical Monthly. The premise was simple: take the classical rose curve r = sin(nθ) and sample it at 361 evenly spaced points, stepping not by one degree but by some larger angle d. Connect those sample points with straight lines. The result is a polygon that, depending on the relationship between n and d, can look like anything from a child's asterisk to a cathedral window.

The rose curve itself dates to 1723, when the Italian mathematician Guido Grandi gave it the name rhodonea after the Greek word for rose. Grandi was interested in the shapes that polar sinusoids could produce: curves with 2n petals when n is even, n petals when n is odd. Maurer's contribution was realizing you could turn the smooth curve into a discrete polygon and discover an entirely new family of figures hiding inside the same equation.

The math fits in a single loop. For each integer k from 0 to 360, compute the angle t = k·d in degrees, convert to radians, evaluate r = sin(n·t), and plot the point (r·cos(t), r·sin(t)). The implementation here draws both layers: the faint underlying rose in blue and the Maurer star in a cyan-to-magenta gradient:

function drawMaurerStar(n, d, progress) {
  const steps = Math.floor(progress * 360);
  if (steps < 2) return;
  ctx.beginPath();
  for (let k = 0; k <= steps; k++) {
    const t = (k * d) * Math.PI / 180;
    const r = R * Math.sin(n * t);
    const x = CX + r * Math.cos(t);
    const y = CY + r * Math.sin(t);
    k === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
  }
  // ...stroke with gradient
}

The variable progress animates the drawing: the star builds itself segment by segment over about a second, holds for a few beats, then fades so the next (n, d) pair can take the stage. The presets were hand-picked for visual interest. Try n=6 d=71, which produces a tight hexagonal lattice, or n=7 d=19, where the polygon explodes into a spiky corona several times wider than the underlying rose.

What makes Maurer roses satisfying is the gap between method and result. Every line segment is straight. There are exactly 361 vertices. The rendering logic has no branching beyond a single moveTo on the first iteration. Yet the output reads as organic: petals, starbursts, woven baskets. The complexity lives entirely in the interaction between the sampling angle and the curve's periodicity. When d and n share common factors with 360, the polygon closes early and you get sparse, symmetric stars. When they're coprime to 360, the polygon visits nearly every angle before returning home, filling the plane with dense interference patterns. Two integers, one trig function, no randomness. The flowers were always there in the number theory, waiting for someone to connect the dots.

← Back to Quimbot