;;; Scheme Recursive Art Contest Entry ;;; ;;; Please do not include your name or personal info in this file. ;;; ;;; Title: 'Welcome to Berkeley' ;;; ;;; Description: ;;; When the fog comes ;;; The red sun yields even when Carol Christ stands ;;; 'Welcome to Berkeley' ;;; utilities (define (paint-prep col) (pendown) (color col) (begin_fill)) (define (cadr lst) (car (cdr lst))) (define (caddr lst) (cadr (cdr lst))) ;;; color utlities ;;; (define (lighter color-string) (define red (gradient (car color-string))) (define green (gradient (cadr color-string))) (define blue (gradient (caddr color-string))) (cons (rgb red green blue) (cons (list red green blue) nil)) ) (define (gradient col) (if (> col 0.95) 1 (+ col 0.05))) (define (shades col) (cons-stream (rgb-convert col) (shades (cadr (lighter col))))) (define (rgb-convert color-string) (rgb (car color-string) (cadr color-string) (caddr color-string))) ; color palettes (define sun-col (shades '(0.9 0.02 0.01))) (define tower-col (shades '(0.85 0.72 0.44))) (define clock-col (shades '(0.55 0.66 0.9))) (define sky-col (shades '(0.3 0.45 0.85))) (define fog-col (shades '(0.45 0.45 0.45))) ;;; sky ;;; (define (sky) (define (sky-painter col pos_x pos_y n) (if (= n 0) nil (begin (penup) (setpos pos_x pos_y) (setheading 180) (paint-prep (car col)) (forward 200) (left 90) (forward 900) (left 90) (forward 200) (end_fill) (sky-painter (cdr-stream col) pos_x (- pos_y 200) (- n 1))))) (sky-painter sky-col -450 450 5)) ; red circular sun with degrading color (define (sun) (sky) (sun-painter 0 sun-col)) (define (sun-painter i col-string) (if (= i 5) nil (begin (penup) (setpos 150 (+ 100 (* i 20))) (setheading 90) (paint-prep (car col-string)) (circle (- 80 (* 20 i))) (end_fill) (sun-painter (+ i 1) (cdr-stream col-string))))) ;;; campanile ;;; (define (campanile) (rec-block) (shading 180) (window -145 115) (window -90 115) (window -35 115) (clock) (tower-top)) ; rectangular block of the top 180*200 ; start (-200 150), end (-200 -50) (define (rec-block) (penup) (setpos -200 150) (paint-prep "white") (setheading 90) (forward 180) (right 90) (forward 200) (right 90) (forward 180) (end_fill) ) ; 3 windows with dark blue shading, 20-r semi-circle and 40*130 window ceils ; #1: (-145 115) #2: (-90 115) #3: (-35 115) (define (window pos_x pos_y) (penup) (setpos pos_x pos_y) (setheading 0) (paint-prep "grey") (circle 20 180) (setheading 180) (forward 130) (left 90) (forward 40) (end_fill)) ; shading based on width of building (define (shading weidth) (define (shade-painter n) (if (= n 0) nil (begin (forward weidth) (left 90) (forward 7.5) (left 90) (shade-painter (- n 1))))) (setheading 90) (paint-prep "#9F9788") (shade-painter 2) (end_fill)) ; tower top, maybe use mirroring (define (tower-top) (penup) (setpos -210 150) (setheading 90) (paint-prep "white") (forward 200) (left 90) (forward 54.64) (left 150) (forward 40) (right 60) (forward 160) (right 60) (forward 40) (left 150) (forward 54.64) (end_fill) (shading 200) (top)) ; triangular top with graduate shading, 50 degree angle (define (top) (define (top-painter bottom col pos_x pos_y) (if (< (- bottom 33.8) 0) nil (begin (penup) (setpos pos_x pos_y) (paint-prep (car col)) (setheading 90) (forward bottom) (left 115) (forward 40) (left 65) (forward (- bottom 33.8)) (end_fill) (top-painter (- bottom 33.8) (cdr-stream col) (+ pos_x 16.9) (+ pos_y 36.26))))) (top-painter 160 tower-col -190 170)) ; clock body with graduated shading (define (clock) (clock-body 0 170 clock-col) (clock-plate)) (define (clock-body i length col-string) (if (= i 7) nil (clock-body (+ i 1) (rec-drawer (car col-string) (- (- 195) (* i 3.486)) (- (- 50) (* i 39.847)) length) (cdr-stream col-string)) )) ; body of the window panels (define (rec-drawer col pos_x pos_y length) (penup) (setpos pos_x pos_y) (setheading 185) (paint-prep col) (forward 40) (setheading 90) (forward (+ length 1.396)) (setheading -5) (forward 40) (end_fill) (+ length 6.972)) ; clock, 60-r circle and 2 needles (define (clock-plate) (penup) (setpos -110 -200) (paint-prep "white") (setheading 90) (circle 50) (end_fill) (paint-prep "grey") (circle 50) (penup) (setpos -110 -105) (setheading 180) (pendown) (color "black") (forward 48) (left 90) (forward 30)) ;;; fog ;;; (define (fog i col) (if (= i 7) nil (begin (paint-fog (car col) (+ 300 (* i 50)) (- 300 (* i 100))) (paint-fog (car col) (- 350 (* i 150)) (* i 25)) (fog (+ i 1) (cdr-stream col))))) (define (paint-fog col pos_x pos_y) (penup) (setpos pos_x pos_y) (paint-prep col) (setheading -60) (define (fog-painter n) (cond ((= n 0) (setheading 90) (forward 900)) ((= 0 (remainder n 4)) (circle 100 60) (circle 35 90) (circle 140 45) (fog-painter (- n 1))) ((= 0 (remainder n 6)) (forward 200) (circle 10 180) (fog-painter (- n 1))) ((= 0 (remainder n 2)) (circle 40 60) (circle 15 90) (circle 75 30) (fog-painter (- n 1))) (else (forward 100) (circle -15 178) (fog-painter (- n 1))) )) (fog-painter 12) (end_fill) (penup)) ;; drawing time! (define (draw) (speed 10) (sun) (campanile) (fog 0 fog-col) (exitonclick) ) ; Please leave this last line alone. You may add additional procedures above ; this line. (draw)