The Heighway Dragon Curve
Fold a strip of paper in half, again and again, then unfold every crease to a right angle — that's the whole construction.
History
Discovered by paper-folding — NASA physicists John Heighway, Bruce Banks, and William Harter noticed the shape while folding strips of paper in half repeatedly. It reached a wide audience through Martin Gardner’s 1967 Scientific American column, and later appeared on the section-break pages of Michael Crichton’s Jurassic Park.
Fold a long strip of paper in half repeatedly, always the same direction, then unfold every crease to a right angle. The silhouette is a finite approximation of the dragon curve — one of the rare fractals here you can generate with nothing but paper and your hands.
The five steps at a glance: fold three times, then unfold every crease to a right angle.
The same unfolding step, slowed down: watch each of the 7 creases open to a right angle, one at a time — the flat folded strip unfurls straight into an 8-segment dragon curve.
Construction
Encode a right fold as . The turn sequence after folds is built from the previous one:
where joins two sequences end to end, and flips every sign in . It reads more easily worked out by hand than stated abstractly. Start from the empty sequence and build up:
- — no folds yet, nothing to turn.
- — one fold, one turn.
- — take , tack on a , then tack on ‘s signs flipped and reversed (here is a single element, so reversing does nothing and only the flip shows).
- — seven turns for three folds, matching .
Walk unit steps, turning by each entry before stepping, and this sequence traces exactly the silhouette a strip of paper makes after being folded times and unfolded to right angles (Cool Fact box, this chapter). The boundary has Hausdorff dimension exactly , and four copies tile the plane.
The dragon curve can tile the entire plane with copies of itself: four suitably rotated dragon curves fit together edge-to-edge with no gaps or overlaps.
Python implementation
Pseudocode first
folds(n) {
turns = {LEFT}
repeat n times
turns = turns + {LEFT} + reverse(flip(turns))
return turns
}
The executable version keeps the same shape; shared plotting/export details live in fractalfair_helpers.py.
def folds(n):
turns = [1]
for _ in range(n):
turns = turns + [1] + [-t for t in reversed(turns)]
return turns
dragonPoints :: Int -> [P2 Double]
dragonPoints n =
scanl (\pt h -> pt .+^ rotateBy (h/4) unitX) (p2 (0,0)) headings
where
turns = map fromIntegral (foldSeq n)
headings = 0 : scanl1 (+) turns
Figure: 14 simulated folds (16,383 segments), coloured from deep violet to pale gold. Every inward spiral is a smaller, later fold nested inside a larger, earlier one.