akten_quayola · StrataLandscape
Strata Landscape
A geological landscape rendered as N horizontal strata stacked vertically, each band displaced by a slowly growing sinusoid and shaded with its own hue. Inspired by Quayola's Strata series — begun as a personal exploration of Roman baroque churches in 2008 and later extended to Notre Dame and Van Dyck altarpieces — the formula translates the metaphor of geological layering into a computational process: as time advances the perturbation amplitude grows, mimicking erosion and algorithmic weathering of the original.
Original: https://quayola.com/strata-4/
▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.
Math essence
Each layer i has frequency f_i, phase φ_i, hue h_i. The layer top/bot lines are y = i*L + amp(t) * sin(f_i * xs/4 + φ_i + 0.04*t). Per-step amp += perturbation_growth, capped at 0.6. The pixel mask (ys in [top, bot]) selects that layer's palette colour; a 0.85 blend over the previous canvas keeps strata readable.
Parameters
| Name | Type | Default | Range | Description |
|---|---|---|---|---|
num_layers | int | 60 | 20–160 | Number of horizontal strata. |
dim | int | 512 | 256–1024 | Output canvas side length. |
perturbation | float | 0.05 | 0–0.3 | Initial perturbation amplitude of layer lines. |
perturbation_growth | float | 0.0006 | 0–0.005 | Per-step growth of perturbation amplitude (erosion). |
depth_curve | float | 1.4 | 0.5–3 | Shading curve along each stratum (top→bottom darkening). |
Reference
First 60 lines of reference.py. Full source:
library_external/akten_quayola/StrataLandscape/reference.py
from __future__ import annotations
from typing import ClassVar
import numpy as np
class StrataLandscape:
"""Strata Landscape — Quayola, *Strata* series (2008–ongoing).
Quayola's Strata series — begun with the Roman baroque churches in
2008 — deconstructs classical paintings and architecture into
horizontal layers of rock-like strata, each layer gaining its own
degree of digital perturbation. This formula builds that kernel
directly: N horizontal bands stacked vertically, each band
displaced by a slowly mutating sinusoid and shaded with a layer-
specific palette tone.
As t advances, the perturbation amplitude grows and the layers
drift sideways — a "geological" evolution through the work of
erosion and algorithmic weathering that Quayola describes when
discussing Strata's geological metaphor.
"""
family: ClassVar[str] = "akten_quayola"
sketch: ClassVar[str] = "StrataLandscape"
def __init__(
self,
num_layers: int = 60,
dim: int = 512,
perturbation: float = 0.08,
perturbation_growth: float = 0.0003,
depth_curve: float = 1.4,
seed: int | None = None,
background: tuple[int, int, int] = (8, 8, 14),
**_,
) -> None:
self.num_layers = int(num_layers)
self.dim = int(dim)
self.perturbation = float(perturbation)
self.perturbation_growth = float(perturbation_growth)
self.depth_curve = float(depth_curve)
self.bg_color = np.array(background, dtype=np.float32)
self.reset(seed=seed)
def reset(self, seed: int | None = None) -> None:
self.rng = np.random.default_rng(seed)
self.t = 0.0
self.amp = self.perturbation
self.freqs = self.rng.uniform(0.005, 0.02, size=self.num_layers).astype(np.float32)
self.phases = self.rng.uniform(0.0, np.pi * 2.0, size=self.num_layers).astype(np.float32)
hues = np.linspace(0.0, 1.0, self.num_layers, dtype=np.float32)
self.hues = hues + self.rng.normal(scale=0.04, size=self.num_layers).astype(np.float32)
self.hues = np.clip(self.hues, 0.0, 1.0)
self.canvas = np.tile(self.bg_color, (self.dim, self.dim, 1))
def step(self, n: int = 1) -> None:
for _ in range(n):
self.amp += self.perturbation_growth Try running it locally
The reference implementation is self-contained Python with numpy. Install the package and run:
python library_external/akten_quayola/StrataLandscape/reference.py Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.
More from akten × quayola
Gesture Driven Field
akten_quayola · GestureDrivenField
Particles advected through a vector field whose structure is driven by a synthetic gesture signal: a chain of sinusoids at integer-related frequencies.
Lissajous 3D
akten_quayola · Lissajous3D
A three-dimensional Lissajous figure rendered as a single precision line drawing on a deep field.
Mechanical Flower Spline
akten_quayola · MechanicalFlowerSpline
A 2D petal-radius spline r(θ) = r0 + A*cos(p*θ + δ) + B*cos(q*θ) swept 360° around a vertical Y axis to form a procedural flower-like 3D surface, then orthographically projected and depth-shaded.
Pleated Fabric
akten_quayola · PleatedFabric
A textile grid whose vertical coordinate follows z = A * envelope(y) * sin(2π f x + phase(t)), projected obliquely onto a 2D canvas so the folds read as parallel ridges of light.
Simple Harmonic Motion
akten_quayola · SimpleHarmonicMotion
A 100x100 grid of damped harmonic oscillators driven by a periodic central impulse.
Wave Interference
akten_quayola · WaveInterference
N drifting point sources emit circular sinusoidal waves whose superposition is tone-mapped into a stormy ocean-like field.