{
  "version": 1,
  "edition": "Working first edition · five methods",
  "scope": "An exploratory visual taxonomy, not an exhaustive encyclopedia or a claim that visual qualities have sole inventors.",
  "creditSource": "/connections/data.json",
  "methods": [
    {
      "id": "perlin-noise",
      "name": "Perlin noise",
      "role": "Generator",
      "roleDescription": "Produces a spatial field from coordinates.",
      "qualities": ["continuous", "cloudlike", "irregular"],
      "mechanism": "Interpolate dot products between lattice gradients and the offsets to a sample point. Nearby samples vary smoothly.",
      "implementation": "A seeded 2D gradient-noise implementation with eight gradient directions and quintic interpolation. One octave, mapped to color; not the exact 1985 or 2002 reference code, fBm, or a fluid simulation.",
      "control": {"name": "Lattice cells across", "min": 2, "max": 14, "step": 1, "value": 6, "unit": "cells"},
      "canvasDescription": "A continuous violet and cream field. Increasing lattice cells makes the variations smaller and more frequent.",
      "recipe": "fBm + ridged / turbulent",
      "recipeLabel": "Continue to layered-noise recipes",
      "vocabulary": "flow",
      "credits": [{"person": "person-ken-perlin", "target": "recipe-fbm-ridged-turbulent"}],
      "sources": [{"label": "Ken Perlin · Improved Noise reference (2002)", "url": "https://cs.nyu.edu/~perlin/noise/"}, {"label": "An Image Synthesizer (1985) · paper", "url": "https://www.cs.cmu.edu/afs/cs/academic/class/15869-f11/www/readings/perlin85_imagesynthesizer.pdf"}]
    },
    {
      "id": "gaussian-blur",
      "name": "Gaussian blur",
      "role": "Filter",
      "roleDescription": "Transforms an existing image.",
      "qualities": ["soft", "diffuse", "low detail"],
      "mechanism": "Replace each pixel with a weighted neighborhood average. A Gaussian kernel gives nearer pixels more weight; sigma sets its spread.",
      "implementation": "Actual separable convolution of a 128 × 112 grayscale image. The sampled kernel is normalized, truncated at ±3σ, and applied horizontally then vertically with clamped edges. Sigma is measured in source pixels.",
      "control": {"name": "Sigma (σ)", "min": 0, "max": 8, "step": 0.5, "value": 2.5, "unit": "source px"},
      "canvasDescription": "The same geometric image before and after filtering. Increasing sigma softens edges and removes fine detail; zero leaves it unchanged.",
      "eponym": {"name": "Carl Friedrich Gauss", "role": "Mathematical eponym", "note": "The Gaussian name connects to the mathematical distribution. It does not credit Gauss with inventing digital image blur. A digital-filter contribution record is still an open research item here.", "source": "https://mathshistory.st-andrews.ac.uk/Miller/mathsym/stat/"},
      "vocabulary": "grain",
      "vocabularyLabel": "Compare softness with grain",
      "credits": [],
      "sources": [{"label": "HIPR2 · Gaussian smoothing", "url": "https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm"}]
    },
    {
      "id": "l-systems",
      "name": "L-systems",
      "role": "Formal grammar",
      "roleDescription": "Rewrites symbols, then interprets them as geometry.",
      "qualities": ["branching", "recursive", "self-similar"],
      "mechanism": "Rewrite every eligible symbol in parallel, generation by generation. A turtle reads the resulting string as moves, turns, and saved branch positions.",
      "implementation": "A deterministic bracketed L-system: axiom F; production F → F[+F]F[−F]F; four rewriting generations. + and − turn; brackets push and restore turtle state. The drawing is fitted to the frame after each change.",
      "control": {"name": "Branch angle", "min": 10, "max": 50, "step": 1, "value": 25, "unit": "degrees"},
      "canvasDescription": "A line structure repeatedly branches from one trunk. Increasing the turn angle opens the branching geometry.",
      "recipe": "L-systems",
      "vocabulary": "branching",
      "credits": [{"person": "person-aristid-lindenmayer", "target": "recipe-l-systems"}, {"person": "person-przemys-aw-prusinkiewicz", "target": "recipe-l-systems"}],
      "sources": [{"label": "The Algorithmic Beauty of Plants · author archive", "url": "https://algorithmicbotany.org/papers/#abop"}]
    },
    {
      "id": "moire",
      "name": "Moiré",
      "role": "Composition",
      "roleDescription": "Overlays repeated structures.",
      "qualities": ["interference", "bands", "optical"],
      "mechanism": "Superimpose two line grids with a small angular difference. Their local alignments produce larger apparent bands.",
      "implementation": "Two equally spaced, straight-line grids; one stays fixed while the other rotates. This illustrates geometric interference, not a reconstruction of a named artwork. Display scaling can add screen-sampling artifacts.",
      "control": {"name": "Grid rotation", "min": 2, "max": 25, "step": 0.5, "value": 7, "unit": "degrees"},
      "canvasDescription": "Two grids of thin violet lines overlap to form wider bands. Rotating one grid changes the spacing and direction of those bands.",
      "recipe": "Moiré",
      "vocabulary": "interference",
      "credits": [{"person": "person-carlos-cruz-diez", "target": "recipe-moire"}, {"person": "person-gene-kogan", "target": "recipe-moire"}],
      "sources": [{"label": "Cruz-Diez archive · Chromointerférence", "url": "https://cruz-diez.com/works/chromointerference/"}]
    },
    {
      "id": "ordered-dithering",
      "name": "Ordered dithering",
      "role": "Quantization",
      "roleDescription": "Represents continuous tone with discrete marks.",
      "qualities": ["grain", "pixel pattern", "tonal density"],
      "mechanism": "Compare each input value against a threshold from a repeating matrix. Each output pixel becomes one of two values, while the local pattern suggests intermediate tones.",
      "implementation": "A 4 × 4 Bayer threshold matrix, applied to a generated grayscale field. The output has exactly two colors. This is ordered dithering, not Floyd–Steinberg error diffusion or random-dot dithering.",
      "control": {"name": "Brightness offset", "min": -40, "max": 40, "step": 1, "value": 0, "unit": "%"},
      "canvasDescription": "A smooth tonal image at left becomes a regular two-color pixel pattern at right. Brightness changes the density of dark pixels.",
      "recipe": "Halftone systems",
      "vocabulary": "grain",
      "credits": [{"person": "person-bryce-e-bayer", "target": "recipe-halftone-systems"}],
      "sources": [{"label": "Bayer (1973) · bibliographic record", "url": "https://ndlsearch.ndl.go.jp/en/books/R100000136-I1570009749134624128"}, {"label": "HIPR2 · dithering overview", "url": "https://homepages.inf.ed.ac.uk/rbf/HIPR2/dither.htm"}]
    }
  ]
}
