Chapter 2, Building Abstractions with Data

Section - 2.2 - Hierarchical Data and the Closure Property

Exercise 2.52


(a)

I added eyes and mouth.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(define wave 
   (segments->painter 
        (list 
           (make-segment (make-vect .25 0) (make-vect .35 .5)) 
           (make-segment (make-vect .35 .5) (make-vect .3 .6)) 
           (make-segment (make-vect .3 .6) (make-vect .15 .4)) 
           (make-segment (make-vect .15 .4) (make-vect 0 .65)) 
           (make-segment (make-vect 0 .65) (make-vect 0 .85)) 
           (make-segment (make-vect 0 .85) (make-vect .15 .6)) 
           (make-segment (make-vect .15 .6) (make-vect .3 .65)) 
           (make-segment (make-vect .3 .65) (make-vect .4 .65)) 
           (make-segment (make-vect .4 .65) (make-vect .35 .85)) 
           (make-segment (make-vect .35 .85) (make-vect .4 1)) 
           (make-segment (make-vect .4 1) (make-vect .6 1)) 
           (make-segment (make-vect .6 1) (make-vect .65 .85)) 
           (make-segment (make-vect .65 .85) (make-vect .6 .65)) 
           (make-segment (make-vect .6 .65) (make-vect .75 .65)) 
           (make-segment (make-vect .75 .65) (make-vect 1 .35)) 
           (make-segment (make-vect 1 .35) (make-vect 1 .15)) 
           (make-segment (make-vect 1 .15) (make-vect .6 .45)) 
           (make-segment (make-vect .6 .45) (make-vect .75 0)) 
           (make-segment (make-vect .75 0) (make-vect .6 0)) 
           (make-segment (make-vect .6 0) (make-vect .5 .3)) 
           (make-segment (make-vect .5 .3) (make-vect .4 0)) 
           (make-segment (make-vect .4 0) (make-vect .25 0))
           (make-segment (make-vect 0.43 0.9) (make-vect 0.45 0.9))  ;new segment
           (make-segment (make-vect 0.53 0.9) (make-vect 0.55 0.9))  ;new segment
           (make-segment (make-vect 0.47 0.75) (make-vect 0.51 0.75)) ;new segment
        )
   )
)

(b)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; using only one image as suggested in exercise
(define (corner-split-alt1 painter n)
  (if (= n 0)
      painter
      (let (
             (up (up-split painter (- n 1)))
             (right (right-split painter (- n 1)))
             (corner (corner-split painter (- n 1)))
           )
           (beside
               (below painter up)
               (below right corner)
           )
     )
  )
)

; here i swapped below and beside of the original cornet split
(define (corner-split-alt2 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 top-left)
                  (beside bottom-right corner))))))

(c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(define (square-limit-alt painter n) 
   (let (
          (combine4
                (square-of-four
                            flip-vert
                            rotate180 
                            identity
                            flip-horiz
                )
          )
        ) 
        (combine4
              (corner-split painter n)
        )
   )
)