Functional PostScript Examples
This procedure draws a sun with n number of spikes around a color
wheel (with a disturbingly cute smile). It demonstrates how to
use the with-attrib syntax to temporarily change the default style.
[PostScript Output]
(define (sun n)
(let* ((radius 50) ;radius of circle
(l 20) ;length of sun spikes
(sat 1) ;saturation
(bri 1) ;brightness
(stick (line (pt 0 0) (pt radius 0)))
(long-stick (line (pt 0 0) (pt (+ radius l) 0)))
(full-step (/ 2pi n))
(half-step (/ full-step 2))
(hue-step3 (/ 1 n))
(hue-step1 (/ hue-step3 3))
(hue-step2 (* hue-step1 2)))
(with-attrib ((:line-width 2))
(translate 300 300
(compose
;; add disturbing smiley face
(with-attrib ((:color (rgb 1 .1 .1)))
(compose
;; right eye
(translate (* .3 radius) (* .1 radius)
(fill (arc origin (* .1 radius) 0 2pi)))
;; left eye
(translate (* -.3 radius) (* .1 radius)
(fill (arc origin (* .1 radius) 0 2pi)))
;; mouth
(stroke (arc origin (* .5 radius) pi 2pi))))
(let lp ((n n) (hue 0))
(let ((spike-pt (end-pt (rotate half-step long-stick))))
(if (> n 0)
(compose
;; first spike edge
(stroke
(line (end-pt stick) spike-pt)
(:color (hsb (- hue hue-step1) sat bri)))
;; second spike edge
(stroke
(line spike-pt (end-pt (rotate full-step stick)))
(:color (hsb hue sat bri)))
;; arc section
(stroke
(arc origin radius 0 full-step)
(:color (hsb (- hue hue-step2) sat bri)))
;; the other spikes
(rotate full-step (lp (- n 1) (+ hue hue-step3))))
;; recursion ends
the-empty-pict))))))))
FPS Examples: Right-angle Fractal | Arrow Fractal | Headlines | Clipping Message | Turkey Bitmap | Sun | Bounding Box | Morphing Square to Circle | Text Along a Circle | Demo Driver