racket/collects/graphics/turtle-examples.rkt
Rodolfo Henrique Carvalho 19f43d27aa Typos in turtles (code and docs).
The name of the mathematician is Sierpinski.

* Serpinski => Sierpinski
* Rename serp => sierp.
2012-02-10 02:41:48 -05:00

309 lines
7.8 KiB
Racket

#lang racket
(require graphics/turtles)
(provide regular-poly regular-polys radial-turtles spaced-turtles
spokes spyro-gyra neato graphics-bexam sierp-size sierp sierp-nosplit
koch-size koch-split koch-draw lorenz lorenz1 peano-size
peano-position-turtle peano fern-size fern1 fern2 gapped-lines)
(define (regular-poly sides radius)
(define theta (/ (* 2 pi) sides))
(define side-len (* 2 radius (sin (/ theta 2))))
(define (draw-sides n)
(cond
[(zero? n) (void)]
[else
(draw side-len)
(turn/radians theta)
(draw-sides (sub1 n))]))
(tprompt (move radius)
(turn/radians (/ (+ pi theta) 2))
(draw-sides sides)))
(define (regular-polys sides s)
(define (make-polys n)
(cond
[(zero? n) (void)]
[else
(regular-poly sides (* n 5))
(make-polys (sub1 n))]))
(make-polys sides))
(define (radial-turtles n)
(cond
[(zero? n) (void)]
[else
(split (turn/radians (/ pi (expt 2 (sub1 n)))))
(radial-turtles (sub1 n))]))
(define (spaced-turtles n)
(cond
[(zero? n) (void)]
[else
(split (move (expt 2 (+ n 1))))
(spaced-turtles (sub1 n))]))
(define (spokes)
(radial-turtles 4)
(spaced-turtles 5)
(turn/radians (/ pi 2))
(draw 10))
(define (spyro-gyra)
(radial-turtles 4)
(regular-poly 3 100))
(define (neato)
(define (spiral d t)
(cond
[(<= 1 d)
(draw d)
(turn/radians t)
(spiral (- d 1) t)]
[else (void)]))
(radial-turtles 4)
(spiral 30 (/ pi 12)))
(define (graphics-bexam)
(define (gb d)
(cond
[(<= d 3)
(draw d)]
[else
(define new-d (/ d 3))
(gb new-d)
(turn/radians (- (/ pi 2)))
(gb new-d)
(turn/radians (/ pi 2))
(gb new-d)
(turn/radians (/ pi 2))
(gb new-d)
(turn/radians (- (/ pi 2)))
(gb new-d)]))
(define square-size (expt 3 5))
(split (turn/radians (/ pi 2))
(move square-size)
(turn/radians (- (/ pi 2)))
(move square-size)
(turn/radians pi))
(split (move square-size)
(turn/radians (/ pi 2)))
(gb square-size))
(define sierp-size 120)
(define (sierp distance)
(define sqrt3 (sqrt 3))
(define -2pi/3 (- 0 (/ (* 2 pi) 3)))
(define pi/6 (/ pi 6))
(define -5pi/6 (- 0 (/ (* 5 pi) 6)))
(define pi/2 (/ pi 2))
(define (engine distance)
(unless (< distance 1)
(define side-half (* distance sqrt3))
(define side (* 2 side-half))
(turn/radians -2pi/3)
(move distance)
(split (move distance)
(turn/radians -5pi/6)
(draw side)
(turn/radians -5pi/6)
(move distance)
(turn/radians pi)
(split (turn/radians -5pi/6)
(move side-half)
(turn/radians pi/6)))
(engine (/ distance 2))))
(move (* 2 distance))
(turn/radians (/ (* 5 pi) 6))
(draw (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(move (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(draw (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(turn/radians (/ pi 6))
(move (* 2 distance))
(turn/radians pi)
(engine distance))
(define (sierp-nosplit distance)
(define sqrt3 (sqrt 3))
(define -2pi/3 (- 0 (/ (* 2 pi) 3)))
(define pi/6 (/ pi 6))
(define -5pi/6 (- 0 (/ (* 5 pi) 6)))
(define pi/2 (/ pi 2))
(define (engine distance)
(unless (< distance 1)
(define side-half (* distance sqrt3))
(define side (* 2 side-half))
(turn/radians -2pi/3)
(move distance)
(engine (/ distance 2))
(move distance)
(turn/radians -5pi/6)
(draw side)
(turn/radians -5pi/6)
(move distance)
(turn/radians pi)
(engine (/ distance 2))
(turn/radians -5pi/6)
(move side-half)
(turn/radians pi/6)
(engine (/ distance 2))
(move (- distance))))
(move (* 2 distance))
(turn/radians (/ (* 5 pi) 6))
(draw (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(move (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(draw (* distance 2 (sqrt 3)))
(turn/radians (/ (* 2 pi) 3))
(turn/radians (/ pi 6))
(move (* 2 distance))
(turn/radians pi)
(engine distance))
(define koch-size (expt 3 5))
(define (koch-split koch-size)
(define (build-up-turtles n)
(cond
[(<= n 3) 'built]
[else
(define third (/ n 3))
(split* 'stay-put
(move (* 2 third))
(begin (move third)
(turn/radians (- (/ pi 3))))
(begin (move third)
(turn/radians (- (/ pi 3)))
(move third)
(turn/radians (* 2 (/ pi 3)))))
(build-up-turtles third)]))
(split* 'stay-put
(begin (move koch-size)
(turn/radians (/ (* 2 pi) 3)))
(begin (turn/radians (/ pi 3))
(move koch-size)
(turn/radians pi)))
(build-up-turtles koch-size)
(draw 3))
(define (koch-draw koch-size)
(define (side n)
(cond
[(<= n 3) (draw n)]
[else
(define third (/ n 3))
(side third)
(turn/radians (- (/ pi 3)))
(side third)
(turn/radians (* 2 (/ pi 3)))
(side third)
(turn/radians (- (/ pi 3)))
(side third)]))
(split* 'stay-put
(begin (move koch-size)
(turn/radians (/ (* 2 pi) 3)))
(begin (turn/radians (/ pi 3))
(move koch-size)
(turn/radians pi)))
(side koch-size))
(define (lorenz a b c)
(define (loop x y z)
(define delta 0.01)
(define dx (* delta (* a (- y x))))
(define dy (* delta (- (* x b) y (* x z))))
(define dz (* delta (- (* x y) (* c z))))
(draw-offset dx dz)
(sleep 0.05)
(erase-offset (- dx) (- dz))
(move-offset dx dz)
(loop (+ x dx)
(+ y dy)
(+ z dz)))
(loop 1 1 1))
(define (lorenz1) (lorenz 50 60 11))
(define peano-size (expt 3 6))
(define (peano-position-turtle)
(clear)
(move -270)
(turn/radians (/ pi 2))
(move 250)
(turn/radians (- (/ (* 3 pi) 4))))
(define (peano l)
(cond
[(<= l 3)
(draw l)]
[else
(define new-l (/ l 3))
(peano new-l)
(tprompt (peano new-l)
(split* (turn/radians (/ pi 2))
(turn/radians (- (/ pi 2))))
(peano new-l))
(tprompt (split* (turn/radians (/ pi 2))
(turn/radians (- (/ pi 2))))
(peano new-l))
(tprompt (split* (move new-l)
(begin (turn/radians (/ pi 2))
(move new-l)
(turn/radians (- (/ pi 2))))
(begin (turn/radians (- (/ pi 2)))
(move new-l)
(turn/radians (/ pi 2))))
(peano l))
(move (* 2 new-l))]))
(define fern-size 30)
(define (fern1 n)
(cond
[(< 1 n)
(draw (/ n 2))
(tprompt (split* (turn/radians (/ pi 3))
(turn/radians (- (/ pi 3))))
(fern1 (/ n 2)))
(draw (/ n 2))
(turn/radians 0.08)
(fern1 (- n 1))]
[else (void)]))
;; need to backup a little for this one.
(define (fern2 n)
(define d 0.04)
(define (fernd n sign)
(cond
[(< 1 n)
(draw (/ n 2))
(tprompt (turn/radians (/ pi 3))
(fernd (/ n 2) -))
(tprompt (turn/radians (- (/ pi 3)))
(fernd (/ n 2) +))
(draw (/ n 2))
(turn/radians (sign d))
(fernd (- n 1) sign)]
[else (void)]))
(fernd n +))
(define (gapped-lines)
(define gaps 5)
(define lines 3)
(tprompt
(turn/radians (/ pi 2))
(spaced-turtles lines)
(turn/radians (- (/ pi 2)))
(draw (* 4 (expt 2 gaps))))
(tprompt
(spaced-turtles gaps)
(turn/radians (/ pi 2))
(erase (* 4 (expt 2 lines)))))