#lang racket/load ;#lang planet neil/sicp (require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1))) ;(require (planet neil/sicp:1:13)) (define (identity x) x) (define (flipped-pairs painter) (let ((painter2 (beside painter (flip-vert painter)))) (below painter2 painter2))) (paint (flipped-pairs einstein)) (define (right-split painter n) (if (= n 0) painter (let ((smaller (right-split painter (- n 1)))) (beside painter (below smaller smaller))))) (paint (right-split einstein 2)) (define (corner-split painter n) (if (= n 0) painter (let ((up (up-split painter (- n 1))) (right (right-split painter (- n 1)))) (let ((top-left (beside up up)) (bottom-right (below right right)) (corner (corner-split painter (- n 1)))) (below (beside painter bottom-right) (beside top-left corner)))))) (define (square-limit painter n) (let ((corner (corner-split painter n))) (let ((half (beside (flip-horiz corner) corner))) (below (flip-vert half) half)))) ;; ex 2.44 (define (up-split painter n) (if (= n 0) painter (let ((smaller (up-split painter (- n 1)))) (below painter (beside smaller smaller))))) (paint (up-split einstein 2)) ;; higher order operations (define (square-of-four tl tr bl br) (lambda (painter) (let ((top (beside (tl painter) (tr painter))) (bottom (beside (bl painter) (br painter)))) (below bottom top)))) (define (flipped-pairs2 painter) (let ((combine4 (square-of-four identity flip-vert identity flip-vert))) (combine4 painter))) (paint (flipped-pairs2 einstein)) ;; square-limit in terms of square-of-four (define (square-limit2 painter n) (let ((square (square-of-four flip-horiz identity rotate180 flip-vert))) (square (corner-split painter n)))) (paint (square-limit2 einstein 1)) ;; ex 2.45 (define (split op1 op2) (lambda (painter n) (if (= n 0) painter (let ((smaller ((split op1 op2) painter (- n 1)))) (op1 painter (op2 smaller smaller)))))) (define usplit (split below beside)) (define rsplit (split beside below)) ;; ex 2.46 ;; A vector running from origin to (x,y) can be represented by a cons cell (define (make-vect x y) (cons x y)) (define (xcor-vect v) (car v)) (define (ycor-vect v) (cdr v)) ;; vector operations (define (add-vect v1 v2) (make-vect (+ (xcor-vect v1) (xcor-vect v2)) (+ (ycor-vect v1) (ycor-vect v2)))) (define (sub-vect v1 v2) (make-vect (- (xcor-vect v1) (xcor-vect v2)) (- (ycor-vect v1) (ycor-vect v2)))) (define (scale-vect s v) (make-vect (* s (xcor-vect v)) (* s (ycor-vect v)))) ;; ex 2.47 ;; a (define (make-frame1 origin edge1 edge2) (list origin edge1 edge2)) (define (origin-frame1 frame) (car frame)) (define (edge1-frame1 frame) (car (cdr frame))) (define (edge2-frame1 frame) (car (cdr (cdr frame)))) ;; b (define (make-frame2 origin edge1 edge2) (cons origin (cons edge1 edge2))) (define (origin-frame2 frame) (car frame)) (define (edge1-frame2 frame) (car (cdr frame))) (define (edge2-frame2 frame) (cdr (cdr frame))) ;; for now use option a. (define origin-frame origin-frame1) (define edge1-frame edge1-frame1) (define edge2-frame edge2-frame1) ;;; frames (define (frame-coord-map frame) (lambda (v) (add-vect (origin-frame frame) (add-vect (scale-vect (xcor-vect v) (edge1-frame frame)) (scale-vect (ycor-vect v) (edge2-frame frame)))))) ;; ex 2.48 (define (make-segment v1 v2) (cons v1 v2)) (define (start-segment segment) (car segment)) (define (end-segment segment) (cdr segment)) ;; ex 2.49 ;; a. The painter that draws the outline of the designated frame. (define one 0.99) (define zero 0) (define (outline frame) ((segments->painter (list (make-segment (make-vect zero zero) (make-vect one zero)) (make-segment (make-vect one zero) (make-vect one one)) (make-segment (make-vect one one) (make-vect zero one)) (make-segment (make-vect zero one) (make-vect zero zero)))) frame)) ;; b. The painter that draws an ``X'' by connecting opposite corners of the frame. (define (x-connect frame) ((segments->painter (list (make-segment (make-vect zero zero) (make-vect one one)) (make-segment (make-vect zero one) (make-vect one zero)))) frame)) ;; c. The painter that draws a diamond shape by connecting the midpoints of the ;; sides of the frame. (define (diamond frame) (let ((v1 (make-vect 0.5 0)) (v2 (make-vect 0.999 0.5)) (v3 (make-vect 0.5 0.999)) (v4 (make-vect 0 0.5))) ((segments->painter (list (make-segment v1 v2) (make-segment v2 v3) (make-segment v3 v4) (make-segment v4 v1))) frame))) ;; d. The wave painter. (define (waveman frame) (let ((p1 (make-vect 0.25 0)) (p2 (make-vect 0.4 0.4)) (p3 (make-vect 0.25 0.5)) (p4 (make-vect 0.15 0.4)) (p5 (make-vect 0 0.7)) (p6 (make-vect 0 0.8)) (p7 (make-vect 0.15 0.55)) (p8 (make-vect 0.25 0.6)) (p9 (make-vect 0.4 0.6)) (p10 (make-vect 0.35 0.75)) (p11 (make-vect 0.4 0.9)) (p12 (make-vect 0.6 0.9)) (p13 (make-vect 0.65 0.75)) (p14 (make-vect 0.6 0.6)) (p15 (make-vect 0.8 0.6)) (p16 (make-vect 0.999 0.25)) (p17 (make-vect 0.999 0.1)) (p18 (make-vect 0.6 0.4)) (p19 (make-vect 0.75 0)) (p20 (make-vect 0.65 0)) (p21 (make-vect 0.5 0.2)) (p22 (make-vect 0.35 0))) (let ((s1 (make-vect p1 p2)) (s2 (make-vect p2 p3)) (s3 (make-vect p3 p4)) (s4 (make-vect p4 p5)) (s5 (make-vect p6 p7)) (s6 (make-vect p7 p8)) (s7 (make-vect p8 p9)) (s8 (make-vect p9 p10)) (s9 (make-vect p10 p11)) (s10 (make-vect p12 p13)) (s11 (make-vect p13 p14)) (s12 (make-vect p14 p15)) (s13 (make-vect p15 p16)) (s14 (make-vect p17 p18)) (s15 (make-vect p18 p19)) (s16 (make-vect p20 p21)) (s17 (make-vect p21 p22))) ((segments->painter (list s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17)) frame))))