Gallery › Geometry and fractals
Infinite Descent
A hyperbolic tessellation: one heptagon reflected across its own edges, four generations deep.
How it is made
A single heptagon is reflected across each of its edges, and the copies across theirs, for four generations. The tiles are drawn on the Poincaré disc, where the hyperbolic plane's infinite tiling shrinks toward the rim; 232 tiles are coloured in rings by generation. It uses artkit's httile.
Details
- Category
- Geometry and fractals
- Libraries
- none: this piece is plain PostScript
- Added
- 2026-08-02
- Page size
- 640 × 640 points
Source
View source the whole program in a scrolling window, or read gallery/infinite_descent.ps on GitHub. To draw it yourself, from a checkout of the repository:
pscat --page 640x640 gallery/infinite_descent.ps
Open it in the playground and watch it draw in your browser: this piece reads no other file, so it runs there unchanged.
The first 40 of 212 lines of the source
%!PS-Adobe-3.0
%%Title: Infinite Descent
%%BoundingBox: 0 0 640 640
%%EndComments
% A Poincare-disk hyperbolic tessellation: 232 heptagons, three meeting
% at every vertex ({7,3} in the standard notation), generated by
% starting from one heptagon at the center and reflecting it across its
% own edges to spawn its neighbors, out to four reflection generations.
% Every tile is congruent in the *hyperbolic* metric this disk models —
% the shrinking toward the rim is the model's own distortion, not a
% property of the tiling. Colored by generation, so the reflections read
% as rings radiating from the center, the way ripples would if the
% "flat" surface they crossed actually curved this way. Seeded rand only
% picks the palette rotation's starting offset; the tiling itself is
% pure arithmetic, no randomness in the geometry.
%
% Gallery II (issue #10, hyperbolic geometry) — inlines horthocircle,
% hreflect, hpoly, and httile from lib/artkit.ps per the gallery's
% self-containment doctrine (see hortus.ps). hpoint and hgeo are the two
% library procs *not* needed here — httile never calls either.
%
% pscat --page 640x640 gallery/infinite_descent.ps
3 srand
% --- the toolkit subset (from lib/artkit.ps) --------------------------
/horthocircle {
/hoy2 exch def /hox2 exch def /hoy1 exch def /hox1 exch def
/hod1 hox1 dup mul hoy1 dup mul add def
/hod2 hox2 dup mul hoy2 dup mul add def
/hocross hox1 hoy2 mul hoy1 hox2 mul sub def
/honoise hox1 hoy2 mul abs hoy1 hox2 mul abs add def
/hodeg hocross abs honoise 1e-6 mul le def
hodeg {
hod1 hod2 gt { hox1 hoy1 } { hox2 hoy2 } ifelse
/hodry exch def /hodrx exch def
/hodrn hodrx dup mul hodry dup mul add sqrt def
hodrn 0 gt { hodrx hodrn div hodry hodrn div } { 1 0 } ifelse
0 true