;;Min Cheng ;;Login: cs61a-aw ;;Sangmi (Katie) Shin ;;Login: cs61a-bs ;;TA: Erik ;;section 107 ;; Code for CS61A project 2 -- picture language (define (flipped-pairs painter) (let ((painter2 (beside painter (flip-vert painter)))) (below painter2 painter2))) (define (right-split painter n) (if (= n 0) painter (let ((smaller (right-split painter (- n 1)))) (beside painter (below smaller smaller))))) (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)))) (beside (below painter top-left) (below bottom-right corner)))))) (define (square-limit painter n) (let ((quarter (corner-split painter n))) (let ((half (beside (flip-horiz quarter) quarter))) (below (flip-vert half) half)))) (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 (identity x) x) (define (flipped-pairs painter) (let ((combine4 (square-of-four identity flip-vert identity flip-vert))) (combine4 painter))) ;; or ; (define flipped-pairs ; (square-of-four identity flip-vert identity flip-vert)) (define (square-limit painter n) (let ((combine4 (square-of-four flip-horiz identity rotate180 flip-vert))) (combine4 (corner-split painter n)))) (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)))))) (define (segments->painter segment-list) (lambda (frame) (for-each (lambda (segment) (draw-line ((frame-coord-map frame) (start-segment segment)) ((frame-coord-map frame) (end-segment segment)))) segment-list))) (define (draw-line v1 v2) (penup) (setxy (- (* (xcor-vect v1) 200) 100) (- (* (ycor-vect v1) 200) 100)) (pendown) (setxy (- (* (xcor-vect v2) 200) 100) (- (* (ycor-vect v2) 200) 100))) (define (transform-painter painter origin corner1 corner2) (lambda (frame) (let ((m (frame-coord-map frame))) (let ((new-origin (m origin))) (painter (make-frame new-origin (sub-vect (m corner1) new-origin) (sub-vect (m corner2) new-origin))))))) (define (flip-vert painter) (transform-painter painter (make-vect 0.0 1.0) (make-vect 1.0 1.0) (make-vect 0.0 0.0))) (define (shrink-to-upper-right painter) (transform-painter painter (make-vect 0.5 0.5) (make-vect 1.0 0.5) (make-vect 0.5 1.0))) (define (rotate90 painter) (transform-painter painter (make-vect 1.0 0.0) (make-vect 1.0 1.0) (make-vect 0.0 0.0))) (define (squash-inwards painter) (transform-painter painter (make-vect 0.0 0.0) (make-vect 0.65 0.35) (make-vect 0.35 0.65))) (define (beside painter1 painter2) (let ((split-point (make-vect 0.5 0.0))) (let ((paint-left (transform-painter painter1 (make-vect 0.0 0.0) split-point (make-vect 0.0 1.0))) (paint-right (transform-painter painter2 split-point (make-vect 1.0 0.0) (make-vect 0.5 1.0)))) (lambda (frame) (paint-left frame) (paint-right frame))))) ;project 1 code starts here ;;;;;; 2.44 (define (up-split painter n) (if (= n 0) painter (let ((top (up-split painter (- n 1)))) (below painter (beside top top))))) ;;;;;; 2.45 ;(define right-split (split beside below)) ;(define up-split (split below beside)) ;defining split for the procedures above (define (split f1 f2) (lambda (painter n) (if (= n 0) painter (let ((piece ((split f1 f2) painter (- n 1)))) (f1 painter (f2 piece piece)))))) ;;;;;; 2.46 (define (make-vect x y) (cons x y)) (define (xcor-vect v) (car v)) (define (ycor-vect v) (cdr v)) (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)))) ;;;;;; 2.47 (define (make-frame-a origin edge1 edge2) (list origin edge1 edge2)) (define (origin-frame-a frame) (car frame)) (define (edge1-frame-a frame) (car (cdr frame))) (define (edge2-frame-a frame) (nth 2 frame)) ;another way around (define (make-frame-b origin edge1 edge2) (cons origin (cons edge1 edge2))) (define (origin-frame-b frame) (car frame)) (define (edge1-frame-b frame) (car (cdr frame))) (define (edge2-frame-b frame) (cdr (cdr frame))) ;notes: in order to use the codes in picture.scm, ;we need to define make-frame, origin-frame, edge1-frame and edge2-frame (define make-frame make-frame-a) (define origin-frame origin-frame-a) (define edge1-frame edge1-frame-a) (define edge2-frame edge2-frame-a) ;;;;;; 2.48 (define (make-segment v1 v2) (cons v1 v2)) (define (start-segment seg) (car seg)) (define (end-segment seg) (cdr seg)) ;;;;;; 2.49 ;a (define (frame-painter frame) (let ((a (make-vect 0.0 0.0)) (b (make-vect 1.0 0.0)) (c (make-vect 1.0 1.0)) (d (make-vect 0.0 1.0))) ((segments->painter (list (make-segment a b) (make-segment b c) (make-segment c d) (make-segment d a))) frame))) ;b (define (X-painter frame) (let ((a (make-vect 0.0 0.0)) (b (make-vect 1.0 0.0)) (c (make-vect 1.0 1.0)) (d (make-vect 0.0 1.0))) ((segments->painter (list (make-segment a c) (make-segment b d))) frame))) ;c (define (diamond frame) (let ((a (make-vect 0.5 0.0)) (b (make-vect 0.0 0.5)) (c (make-vect 0.5 1.0)) (d (make-vect 1.0 0.5))) ((segments->painter (list (make-segment a b) (make-segment b c) (make-segment c d) (make-segment d a))) frame))) ;d (define (wave frame) (let ((h1 (make-vect 0.35 1)) (h2 (make-vect 0.65 1)) (h3 (make-vect 0.3 0.9)) (h4 (make-vect 0.7 0.9)) (l1 (make-vect 0 0.8)) (l2 (make-vect 0.2 0.6)) (l3 (make-vect 0 0.6)) (l4 (make-vect 0.2 0.4)) (l5 (make-vect 0.3 0.62)) (l6 (make-vect 0.3 0.65)) (t1 (make-vect 0.35 0.65)) (t2 (make-vect 0.65 0.65)) (t3 (make-vect 0.3 0.5)) (t4 (make-vect 0.65 0.45)) (t5 (make-vect 0.5 0.3)) (r1 (make-vect 0.7 0.65)) (r2 (make-vect 1 0.4)) (r3 (make-vect 1.0 0.15)) (f1 (make-vect 0.3 0)) (f2 (make-vect 0.4 0)) (f3 (make-vect 0.6 0)) (f4 (make-vect 0.7 0))) ((segments->painter (list (make-segment h1 h3) (make-segment h3 t1) (make-segment t1 l6) (make-segment l6 l2) (make-segment l2 l1) (make-segment l3 l4) (make-segment l4 l5) (make-segment l5 t3) (make-segment t3 f1) (make-segment f2 t5) (make-segment t5 f3) (make-segment f4 t4) (make-segment t4 r3) (make-segment r2 r1) (make-segment r1 t2) (make-segment t2 h4) (make-segment h4 h2) (make-segment h4 h2))) frame))) ;;;;;; 2.50 (define (flip-horiz painter) (transform-painter painter (make-vect 1.0 0.0) (make-vect 0.0 0.0) (make-vect 1.0 1.0))) (define (rotate180 painter) (transform-painter painter (make-vect 1.0 1.0) (make-vect 0.0 1.0) (make-vect 1.0 0.0))) (define (rotate270 painter) (transform-painter painter (make-vect 0.0 1.0) (make-vect 0.0 0.0) (make-vect 1.0 1.0))) ;;;;;; 2.51 (define (below-a painter1 painter2) (let ((split-point (make-vect 0.0 0.5))) (let ((top (transform-painter painter2 split-point (make-vect 1.0 0.5) (make-vect 0.0 1.0))) (bottom (transform-painter painter1 (make-vect 0.0 0.0) (make-vect 1.0 0.0) split-point))) (lambda (frame) (top frame) (bottom frame))))) ;alternative version, denoted using below_alter (define (below-b painter1 painter2) (rotate270 (beside (rotate90 painter2) (rotate90 painter1)))) ;notes: Again, in order to use the books code, ;we need to define below (define below below-a) ;;;;;; 2.52 ;a ;new-wave adds a face to the wave, but not that happy face (define (new-wave frame) (let ((h1 (make-vect 0.35 1)) (h2 (make-vect 0.65 1)) (h3 (make-vect 0.3 0.9)) (h4 (make-vect 0.7 0.9)) (l1 (make-vect 0 0.8)) (l2 (make-vect 0.2 0.6)) (l3 (make-vect 0 0.6)) (l4 (make-vect 0.2 0.4)) (l5 (make-vect 0.3 0.62)) (l6 (make-vect 0.3 0.65)) (t1 (make-vect 0.35 0.65)) (t2 (make-vect 0.65 0.65)) (t3 (make-vect 0.3 0.5)) (t4 (make-vect 0.65 0.45)) (t5 (make-vect 0.5 0.3)) (r1 (make-vect 0.7 0.65)) (r2 (make-vect 1 0.4)) (r3 (make-vect 1.0 0.15)) (f1 (make-vect 0.3 0)) (f2 (make-vect 0.4 0)) (f3 (make-vect 0.6 0)) (f4 (make-vect 0.7 0)) (e1 (make-vect 0.35 0.9)) (e2 (make-vect 0.4 0.9)) (e3 (make-vect 0.6 0.9)) (e4 (make-vect 0.65 0.9)) (e5 (make-vect 0.45 0.75)) (e6 (make-vect 0.55 0.75))) ((segments->painter (list (make-segment h1 h3) (make-segment h3 t1) (make-segment t1 l6) (make-segment l6 l2) (make-segment l2 l1) (make-segment l3 l4) (make-segment l4 l5) (make-segment l5 t3) (make-segment t3 f1) (make-segment f2 t5) (make-segment t5 f3) (make-segment f4 t4) (make-segment t4 r3) (make-segment r2 r1) (make-segment r1 t2) (make-segment t2 h4) (make-segment h4 h2) (make-segment h4 h2) (make-segment e1 e2) (make-segment e3 e4) (make-segment e5 e6))) frame))) ;b ;new-corner-split us on up and one right split instead of two (define (new-corner-split painter n) (if (= n 0) painter (let ((up (up-split painter (- n 1))) (right (right-split painter (- n 1))) (corner (new_corner-split painter (- n 1)))) (beside (below painter up) (below right corner))))) ;c ;new-square-limit make an image which "squeeze" to the center (define (new-square-limit painter n) (let ((combine4 (square-of-four flip-vert rotate180 identity flip-horiz))) (combine4 (corner-split painter n)))) ;define the full-frame (define full-frame (make-frame (make-vect -0.5 -0.5) (make-vect 1.5 0.0) (make-vect 0.0 1.5)))