meteorite patterns
procedural Widmanstätten pattern generator
I keep the repo here up to date.
This project generates large-format, purely vector, procedurally generated meteorite-like surface patterns and outputs them as PDF files suitable for print, CNC, laser, or further vector processing.
They look like this:
The algorithm was inspired by a slice of the Muonionalusta meteorite, discovered in northern Sweden in 1906. Muonionalusta is an iron-nickel meteorite that exhibits a Widmanstätten pattern when etched, revealing interlocking crystalline phases formed by extremely slow cooling over millions of years.
This generator models the statistical and structural properties visible in etched meteorite slices. It establishes dominant crystallographic directions, draws layered cross-hatching, introduces imperfect, double-etched strokes, accounts for missing material and discontinuities, and basically establishes large-scale grain regions with local variation.
The result is a pattern that looks geologic and crystalline.
output characteristics
- Arbitrary size PDF (limited only by memory/time)
- No rasterization, no textures, no images
- Every run produces a unique pattern by default
- Optional deterministic regeneration via seed
method
The image is synthesized as the superposition of several independent line families, each representing a dominant crystallographic direction.
Each family is generated using the following components:
directional angles
A small set of dominant line orientations is defined (~45°, ~135°, minor orthogonal components). Each stroke family samples from a weighted angular distribution with tight variance, producing strong directional bias without mechanical regularity.
parallel strokes
For each direction, an infinite set of nearly parallel lines is generated, spacing is randomized using a log-normal distribution, lines overshoot the page and are clipped implicitly
This mimics the irregular lamella spacing seen in etched iron-nickel alloys.
grain modulation field
A low-frequency fractal noise field (FBM over value noise) is evaluated across the surface.
This grain field modulates stroke width, stroke opacity, dropout probability, ghost-stroke offsets.
This produces large-scale “crystal regions” where texture coherently shifts.
imperfection
No line is perfectly straight, and lateral jitter is applied along the normal direction, and jitter is smooth, not noisy, to avoid cartoon effects. Additional “ghost strokes” are drawn nearby to simulate double-etching.
gaps, loss
Segments of strokes are randomly dropped based on local grain intensity, producing broken lines, etched voids, and discontinuities characteristic of physical material removal.
randomness
By default: Each run uses a cryptographically strong random seed. You will never get the same output twice unless you use the same seed.
For reproducibility: You may supply an explicit seed. The seed used is printed after generation. Reusing the seed reproduces the pattern exactly.
output
Generated PDFs are automatically timestamped using UTC:
meteorite-YYYY-MM-DD-HH-MM-SS.SS.pdf
Example:
meteorite-2025-12-18-14-03-22.17.pdf
use
dependencies
pip install reportlab
run
python3 meteorite.py
The script will generate a new, unique pattern, write a timestamped PDF, print the output path and seed.
deterministic regeneration
generate_meteorite_pdf(
W=3000,
H=1800,
seed=123456789
)
coordinates, scale
PDF units are points (1/72 inch), but since the output is vector, you may treat units as arbitrary.
For example: 36×24 inches → 2592×1728 points
Large architectural panels are feasible. I’m also thinking hipster graph paper or notebook paper.
home | about | github | mastodon
epoch
1766167093