A grid of hexagons, nudged and split and extruded upward, drawn back to front with nothing but strokes.
A grid, distorted
The island starts as a Grid × Grid arrangement of hexagonal blocks. Each is nudged by
RndDist, some are split into smaller shards, and each is then extruded upward into a
flat-topped pillar.
Height is a function of distance from the centre:
float hh = MathF.Min(dist / MaxDist, 1f);
hh = 1f - MathF.Pow(1f - hh, 1f + Rand());
hh = 1f - hh;
hh *= HeightScale;
Read from the inside out: distance is normalised, then run through a power curve whose
exponent is itself random per pillar, then inverted so the centre is tall. The random
exponent is what stops the profile being a smooth dome — each pillar sits on its own
falloff curve, so neighbours at the same radius can differ substantially in height.
The far rim. Groups are sorted by depth and drawn back to front.
Back to front, and clipped
groups.Sort((a, b) => a.mid.Y.CompareTo(b.mid.Y));
for (int gi = groups.Count - 1; gi > floor; gi--)
Painter’s order — but not painting. Each polygon is clipped against everything already
drawn, so a line that would be hidden behind a nearer pillar is removed rather than
covered.
That matters because there is no fill anywhere in this piece. Every mark is a stroke, so
covering is not available: a nearer pillar drawn over a further one would simply overlap
its lines. Clipping is what makes the drawing read as solid rock.
A third of the groups.
Half. Each pillar contributes a top face and whichever of its side faces point towards
the viewer:
if (seg.p2.X - seg.p1.X >= 0) continue;
One comparison of x coordinates, and back faces are culled. No normals, no dot products —
the projection is fixed, so the sign of the edge direction is enough.
Three quarters.
The whole island. Side faces are cross-hatched with a density that depends on how
directly the face points towards a fixed light direction, so the shading is computed per
face rather than per pillar — which is why adjacent faces of the same pillar carry
visibly different tones.
Five renderings
| Rendering | Grid | Distortion | Split | Ink |
|---|
| Shattered Peak | 15 | 0.6 | 0.55 | white on near-black |
| Gentle Plateau | 18 | 0.3 | 0.10 | brown on warm paper |
| Dark Crystal | 12 | 0.4 | 0.35 | teal on near-black |
| Obsidian | 11 | 0.45 | 0.15 | amber on near-black |
| Lacework | 16 | 0.55 | 0.75 | navy on cool blue-gray |
RndDist and SplitChance decide whether the island reads as a crystal or as a
plateau: high distortion breaks the hexagonal grid into shards, low distortion leaves it
visibly hexagonal. Lacework pushes SplitChance to its limit — at 0.75, very few
hexagons survive intact, and the result is a dense field of tiny crystal shards. Obsidian
goes the other way: eleven hexagons in the grid, low shattering, and an extreme height
scale turn the sparse centre into a cluster of towering pillars.
Gallery presentation
Framed presents Shattered Peak in a museum setting: the same generation, contained in
a central opening and surrounded by a wide warm-paper mat with a thin ruling line at its
inner edge — the shared SkiaSharp.Extensions MuseumFrame presentation layer, which
supplies the wall, mat, rule and frame. The mat colour (#e8e4df) and ruling line (#4a4540)
are chosen to sit alongside the dark-ground renderings in a physical or digital collection
without competing with the work itself.
One framed rendering is intentional. Applying the same treatment to every variant would
reproduce the framing rather than the art — the mat would become background noise rather
than a deliberate compositional choice.
Determinism
The generator is a counter-based hash seeded from the preset and advanced once per call,
in a fixed order — nudges and splits first, then the per-pillar height exponents. No
System.Random anywhere, so the piece is stable across runtimes as well as across runs.
Origin
A fork of Rock Island by markknol on Turtletoy
(turtletoy.net/turtle/68ef188d1f); the
annotated JavaScript is kept beside the source as main.js.