Walldye

Radiolarian

inspired by Ernst Haeckel, Kunstformen der Natur1

Radiolarians are single-celled plankton with silica skeletons that are spined shells pierced with holes.

Made with Claude Opus 5.5

Technique
line art
Inspired by
scientific illustration
Shape
Any screen
Added
27 September 2026

Versions

Export

Shape
cropped from 16:9
Across
Down
Scale
Crop
Size
Format

Colors

  • #1C1B1Abackground
  • #DAD8CEforeground
  • #CF6A4Caccent

Notes

The pores are the cells of a Voronoi diagram on a sphere, built around evenly spread points, so most of them come out six-sided. Laying one shell on a plate follows the radiolarian plates in Haeckel’s Kunstformen der Natur.

Sources

  1. Ernst Haeckel, Kunstformen der Natur, 1904. ↑
  2. Radiolaria.

Source code

wallpapers/diatom/design.py, 118 lines

"""A radiolarian shell as a specimen plate in line and flat tones, with a spherical Voronoi lattice of pores."""

import math

import numpy as np
from numpy.typing import NDArray
from scipy.spatial import SphericalVoronoi

from walldye import (
    ACCENT,
    ACCENT_4,
    BG,
    BG_ALT,
    UI,
    UI_ALT,
    Canvas,
    P,
    Params,
    Rect,
    Vec,
    design,
    knob,
    ladder,
    mix,
    polar,
)

R = 210  # shell radius
PORE = 27  # pore pitch on the sphere surface
STRUT = 0.8  # pore scale inside its Voronoi cell; the rest is shared strut
SPINES = 14
LONG, SHORT = 180, 105  # spine lengths beyond the shell, alternating
HALF = math.degrees(5 / R)  # half the angle a spine's base spans at the shell
BRISTLES = 6 * SPINES
CAPSULE = 0.55 * R  # radius of the glow seen through the pores
DIM = 385  # drop of the dimension line below the center
O = Vec(0, 0)  # the shell center, in the motif's units
GLOW = ladder((BG, ACCENT_4, ACCENT), 18)  # rung 0 is the unlit shell and is never drawn

type Pore = tuple[NDArray[np.float64], float]


def pores() -> list[Pore]:
    """The pores on the visible hemisphere of the shell centered on the origin, as (outline,
    distance of the cell's center from the origin) pairs, projected straight onto the screen."""
    n = round(4 * math.pi * R * R / (PORE * PORE * 0.866))
    i = np.arange(n) + 0.5
    z = 1 - 2 * i / n  # toward the viewer
    rho = np.sqrt(1 - z * z)
    a = i * math.pi * (3 - math.sqrt(5))  # a Fibonacci lattice: near-even sites, mostly hexagons
    sites = np.stack([rho * np.cos(a), rho * np.sin(a), z], 1)
    sv = SphericalVoronoi(sites)
    sv.sort_vertices_of_regions()
    out: list[Pore] = []
    for site, region in zip(sites, sv.regions, strict=True):
        if site[2] < 0.14:  # cells on the limb would poke through the silhouette
            continue
        v = site + (sv.vertices[region] - site) * STRUT
        out.append((R * v[:, :2], R * math.hypot(site[0], site[1])))
    return out


class Drawing(Params):
    dimensions: bool = knob(default=True, doc="the dimension across the shell")


@design(aspects="any", variants={"undimensioned": Drawing(dimensions=False)})
def draw(s: Canvas[Drawing]) -> None:
    # right of center on a landscape screen; centered across a portrait one, above the middle
    c = s.pick(landscape=(0.625, 0.486), portrait=(0.5, 0.4))
    # bounded by the center lines across, the top spine and the dimension below
    with s.motif(c, Rect(-441, -391, 882, 793), handle=R):
        # specimen-plate construction: center lines, and one dimension across the shell
        guide = P().M(-R - 230, 0).H(R + 230).M(0, -R - 150).V(R + 150)
        s.stroke(guide, UI, 1.2, dash=(36, 6, 4, 6))
        if s.params.dimensions:
            y = DIM
            dim = P().M(-R, y).H(R)
            for x in (-R, R):
                dim.M(x, 12).V(y + 14).M(x - 7, y + 7).L(x + 7, y - 7)
            s.stroke(dim, UI, 1.2)

        # spines and bristles sit behind the shell
        spines, ribs, bristles = P(), P(), P()
        for i in range(SPINES):
            b = i * 360 / SPINES
            tip = R + (LONG if i % 2 == 0 else SHORT)
            spines.poly(
                [
                    polar(O, R - 10, bearing=b - HALF),
                    polar(O, tip, bearing=b),
                    polar(O, R - 10, bearing=b + HALF),
                ],
                closed=True,
            )
            ribs.M(polar(O, R, bearing=b)).L(polar(O, tip - 26, bearing=b))
        for i in range(BRISTLES):
            b = (i + 0.5) * 360 / BRISTLES
            bristles.M(polar(O, R, bearing=b)).L(polar(O, R + (15 if i % 3 == 1 else 9), bearing=b))
        s.stroke(bristles, UI, 1.3)
        s.fill(spines, UI)
        s.stroke(ribs, UI_ALT, 1.2)

        # the shell: a shaded disc with every pore cut through it
        holes = pores()
        frame = P().circle(O, R)
        for pts, _ in holes:
            frame.poly(pts, closed=True)
        shade = s.radial_gradient([(0, BG_ALT), (0.7, BG_ALT), (1, mix(BG_ALT, BG, 0.7))], O, R)
        s.fill(P().circle(O, R), BG)  # hides the guides behind the pores
        s.fill(frame, shade, rule="evenodd")

        # the capsule glows through the pores: each pore takes one flat rung by its distance
        with s.buckets(GLOW, "fill") as lit:
            for pts, d in holes:
                if (k := GLOW.rung(1 - d / CAPSULE)) > 0:
                    lit[k].poly(pts, closed=True)
        s.stroke(P().circle(O, R), UI_ALT, 2)

Run it yourself

$ git clone https://github.com/nickolaj-jepsen/walldye && cd walldye$ uv run walldye render diatom --theme fireproof -o diatom-fireproof-16x9.svg