Skip to content
Sample of Cherniak Constellations (Dmitri Cherniak point-cloud + graph)

hobbs_cherniak_penne_deep · CherniakConstellations

Cherniak Constellations (Dmitri Cherniak point-cloud + graph)

A pseudo-random point cloud with connecting lines filtered by distance, producing graph-like emergent forms. ~200 'stars' are placed with a Gaussian centre bias (so the cloud is denser in the middle, the way real constellations are), each with a power-law brightness distribution (mostly dim, a few bright — the canonical astronomical distribution). For each pair of stars, if their distance is below a configurable maximum, a connecting line is drawn. The line's alpha and thickness decrease with distance, and the line's colour is pale cyan/white. Each star is drawn as a small bright core with a soft halo. The result is a sparse graph of clusters and chains — emergent connectivity rather than a fully connected mesh, the canonical constellation aesthetic. Cherniak describes his practice as exploring the 'possibilities of automated art' (LACMA, 2021); a small set of simple rules producing graph-like emergent forms is the simplest example of that ethos.

Original: https://www.dmitricherniak.com

▶ 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
hobbs_cherniak_penne_deep
Source
hobbs_cherniak_penne_deep
Evolution
network
Render
graph_lines
Complexity
low
Agents
200
Year
2024
Author
Dmitri Cherniak (algorithmic homage)

Math essence

Place N stars at positions drawn from N((dim/2, dim/2), (sigma*dim)^2). For each pair (i, j) with d = ||p_i - p_j||, if d < d_max then draw a line with alpha = alpha_max * (1 - (d/d_max)^falloff) and thickness = round(thickness_max * (1 - (d/d_max)^falloff)). For each star, draw a soft halo of radius halo_r and a small bright core of radius star_r, both with alpha proportional to the star's brightness.

Parameters

Name Type Default Range Description
dim int 600 200–1500 Square canvas side length (px).
num_stars int 200 10–2000 Number of stars N in the cloud.
dist_max_frac float 0.18 0.01–1 Max connection distance as fraction of dim.
dist_falloff float 1.6 0.5–6 Power on the distance falloff (higher = sharper cutoff).
center_bias float 0.25 0–0.6 Gaussian sigma (frac of dim) for centre bias. 0 = uniform.
star_radius_frac float 0.0014 0.0005–0.01 Star core radius as fraction of dim.
star_halo_frac float 0.005 0–0.05 Star halo radius as fraction of dim.
line_thickness_max int 2 1–6 Max line thickness (px) at the closest distance.
line_alpha_max float 0.85 0.05–1 Max line alpha (1 = fully opaque).
background tuple 10,12,22 null–null Background RGB colour (night sky).
seed int 42 null–null RNG seed.

Reference

First 60 lines of reference.py. Full source: library_external/hobbs_cherniak_penne_deep/CherniakConstellations/reference.py

"""CherniakConstellations — Dmitri Cherniak pseudo-random constellations.

A homage to Dmitri Cherniak's *Constellations* series: a
pseudo-random point cloud with connecting lines filtered by
distance, producing graph-like emergent forms.

The kernel we implement:

    1. Place N "stars" at random positions on the canvas, with
       a slight bias towards the centre (a Gaussian falloff
       that gives a denser, more constellation-like cluster).
    2. For each pair of stars (i, j), if `||p_i - p_j|| < d_max`,
       draw a line from i to j.  The line's alpha and thickness
       decrease with distance (close pairs: bright + thick;
       distant pairs: faint + thin).
    3. Each star is drawn as a small filled disc with a
       bright centre and a soft halo (the "star" aesthetic).
    4. Lines that pass near a star get a slight brightness boost
       (the "halo" effect that makes the constellation feel
       connected).

Cherniak describes his *Constellations* work as exploring the
"possibilities of automated art" (LACMA, 2021) — a small set
of simple rules producing emergent graph-like forms.  The
key visual signature is the *sparse* connectivity: most pairs
of stars are NOT connected (because their distance exceeds
d_max), so the result is a graph of clusters and chains rather
than a fully connected mesh.

Reference:
- https://www.dmitricherniak.com
- https://www.youtube.com/watch?v=HoMt5vXmtP0
"""
from __future__ import annotations

from typing import ClassVar

import numpy as np


# ---------------------------------------------------------------------------
class CherniakConstellations:
    """Cherniak-style point-cloud + distance-filtered graph.

    Parameters
    ----------
    dim : int
        Square canvas side length (px).
    num_stars : int
        Number of stars N in the cloud.
    dist_max_frac : float
        Maximum connection distance as a fraction of dim.
    dist_falloff : float
        Power on the distance falloff. Higher = sharper cutoff.
    center_bias : float
        Gaussian sigma (as fraction of dim) for the centre bias.
        0 = uniform, 0.4 = strong centre clustering.
    star_radius_frac : float
        Star radius as a fraction of dim.
    star_halo_frac : float

Try running it locally

The reference implementation is self-contained Python with numpy. Install the package and run:

python library_external/hobbs_cherniak_penne_deep/CherniakConstellations/reference.py

Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.

More from hobbs_cherniak_penne_deep

Sample of Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)

Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)

hobbs_cherniak_penne_deep · CherniakNibbles

A cellular-automata growth algorithm in the spirit of Dmitri Cherniak's body of work — small 2D shapes ('nibbles') that grow by selectively removing neighbours.

View →
Sample of Hobbs Color-Field Overlay (Tyler Hobbs compositional method)

Hobbs Color-Field Overlay (Tyler Hobbs compositional method)

hobbs_cherniak_penne_deep · HobbsColorFieldOverlay

Hobbs's compositional method of choice: combine TWO independent fields — a Perlin flow field that drives the *trajectory* of a set of line segments, and a Gaussian-blurred colour field that drives the *colour* and *opacity* of those segments.

View →
Sample of Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)

Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)

hobbs_cherniak_penne_deep · HobbsQLIQUE

A dense tangle of curves where every curve is a streamline through a Perlin flow field, in the visual spirit of Tyler Hobbs's 2022 QQL release (with Dandelion Mane).

View →
Sample of Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)

Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)

hobbs_cherniak_penne_deep · HobbsSpirograph

A rotating-circular-arc trail in the spirit of Tyler Hobbs's *Petal Loops* (2020) and *Elektroanima* (2020) — works described by Hobbs as 'looping taken to an excessive level.' M rotating points (default 8) are connected by a closed polyline that morphs each frame as the whole ring rotates by a small angle around a central anchor.

View →
Sample of Penne Imprecise Balance (Aaron Penne stacked-blocks column)

Penne Imprecise Balance (Aaron Penne stacked-blocks column)

hobbs_cherniak_penne_deep · PenneImpreciseBalance

A column of stacked rectangular blocks where each block is rotated by a seed-derived angle.

View →
Sample of Penne Ringers (Aaron Penne concentric ring extrusion)

Penne Ringers (Aaron Penne concentric ring extrusion)

hobbs_cherniak_penne_deep · PenneRingers

Penne's take on the *Ringers* idiom (best known from Cherniak's Art Blocks release, 2021): concentric rings extruded along the Z axis, rotated about a common axis, projected to 2D.

View →

See all hobbs_cherniak_penne_deep artworks →