Skip to content
Sample of Strata Landscape

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.

Family
akten_quayola
Source
akten × quayola
Evolution
geometry
Render
strata_layers
Complexity
medium
Agents
1
Year
2008
Author
Quayola (Davide Quayola)

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

Sample of Gesture Driven Field

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.

View →
Sample of Lissajous 3D

Lissajous 3D

akten_quayola · Lissajous3D

A three-dimensional Lissajous figure rendered as a single precision line drawing on a deep field.

View →
Sample of Mechanical Flower Spline

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.

View →
Sample of Pleated Fabric

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.

View →
Sample of Simple Harmonic Motion

Simple Harmonic Motion

akten_quayola · SimpleHarmonicMotion

A 100x100 grid of damped harmonic oscillators driven by a periodic central impulse.

View →
Sample of Wave Interference

Wave Interference

akten_quayola · WaveInterference

N drifting point sources emit circular sinusoidal waves whose superposition is tone-mapped into a stormy ocean-like field.

View →

See all akten_quayola artworks →