timothy235 icon

sicp-2-2-4-a-picture-language

timothy235 | PRO | 12/19/24 01:19:16 AM UTC (Edited) | 0 ⭐ | 433 👁️ | Never ⏰ | []
Racket |

8.11 KB

|

None

|

0 👍

/

0 👎

#lang racket
 
;;;;;;;;;;
;; 2.44 ;;
;;;;;;;;;;
 
(define (below painter1 painter2)
  (define split-point (make-vect 0 1/2))
  (define paint-below (transform-painter painter1
                                         split-point
                                         (make-vect 1 1/2)
                                         (make-vect 0 1)))
  (define paint-above (transform-painter painter2
                                         (make-vect 0 0)
                                         (make-vect 1 0)
                                         split-point))
  (lambda (frame)
    (paint-below frame)
    (paint-above frame)))
 
(define (beside painter1 painter2)
  (define split-point (make-vect 1/2 0))
  (define paint-left (transform-painter painter1
                                        (make-vect 0 0)
                                        split-point
                                        (make-vect 0 1)))
  (define paint-right (transform-painter painter2
                                         split-point
                                         (make-vect 1 0)
                                         (make-vect 1/2 1)))
  (lambda (frame) 
    (begin (paint-left frame)
           (paint-right frame))))
 
(define (up-split painter n)
  (cond [(zero? n) painter]
        [else
          (define smaller (up-split painter (sub1 n)))
          (below painter (beside smaller smaller))]))
 
;;;;;;;;;;
;; 2.45 ;;
;;;;;;;;;;
 
(define (split comb1 comb2)
  (lambda (painter n)
    (cond [(zero? n) painter]
          [else
            (define smaller ((split comb1 comb2) painter (sub1 n)))
            (comb1 painter (comb2 smaller smaller))])))
 
(define right-split (split beside below))
(define new-up-split (split below beside))
 
;;;;;;;;;;
;; 2.46 ;;
;;;;;;;;;;
 
(define (make-vect x y) (list x y))
(define (xcor-vect v) (first v))
(define (ycor-vect v) (second 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 origin edge1 edge2)
  (list origin edge1 edge2))
(define (origin-frame frame)
  (first frame))
(define (edge1-frame frame)
  (second frame))
(define (edge2-frame frame)
  (third frame))
 
;; It is a Racket error to use first and rest with dotted pairs.  first and rest
;; can only be used with lists.  Use car and cdr for dotted pairs.
 
;; (define (make-frame origin edge1 edge2)
  ;; (cons origin (cons edge1 edge2)))
;; (define (origin-frame frame)
  ;; (car frame))
;; (define (edge1-frame frame)
  ;; (car (cdr frame)))
;; (define (edge2-frame frame)
  ;; (cdr (cdr frame)))
 
 
;;;;;;;;;;
;; 2.48 ;;
;;;;;;;;;;
 
(define (make-segment v1 v2)
  (list v1 v2))
(define (start-segment segment)
  (first segment))
(define (end-segment segment)
  (second segment))
 
;;;;;;;;;;
;; 2.49 ;;
;;;;;;;;;;
 
;; segments->painter not implemented in this file
 
(define outline-segments
  (list (make-segment (make-vect 0 0)
                      (make-vect 0 1))
        (make-segment (make-vect 0 0)
                      (make-vect 1 0))
        (make-segment (make-vect 0 1)
                      (make-vect 1 1))
        (make-segment (make-vect 1 0)
                      (make-vect 1 1))))
;; (define outline-painter (segments->painter outline-segments))
 
(define x-segments
  (list (make-segment (make-vect 0 0)
                      (make-vect 1 1))
        (make-segment (make-vect 0 1)
                      (make-vect 1 0))))
;; (define x-painter (segments->painter x-segments))
 
(define diamond-segments
  (list (make-segment (make-vect 1/2 0)
                      (make-vect 1 1/2))
        (make-segment (make-vect 1 1/2)
                      (make-vect 1/2 1))
        (make-segment (make-vect 1/2 0)
                      (make-vect 0 1/2))
        (make-segment (make-vect 0 1/2)
                      (make-vect 1/2 1))))
;; (define diamond-painter (segments->painter diamond-segments))
 
(define wave-segments
  (list
    ; head
    (make-segment (make-vect 3/8 0)
                  (make-vect 5/8 0))
    (make-segment (make-vect 3/8 0)
                  (make-vect 3/8 1/4))
    (make-segment (make-vect 3/8 1/4)
                  (make-vect 5/8 1/4))
    (make-segment (make-vect 5/8 0)
                  (make-vect 5/8 1/4))
    ; arms
    (make-segment (make-vect 0 1/4)
                  (make-vect 1 3/4))
    ; body
    (make-segment (make-vect 1/2 1/4)
                  (make-vect 1/2 3/4))
    ; legs
    (make-segment (make-vect 1/4 1)
                  (make-vect 1/2 3/4))
    (make-segment (make-vect 1/2 3/4)
                  (make-vect 3/4 1))))
;; (define wave (segments->painter wave-segments))
 
;;;;;;;;;;
;; 2.50 ;;
;;;;;;;;;;
 
(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 (transform-painter painter origin corner1 corner2)
  (lambda (frame)
    (define m (frame-coord-map frame))
    (define new-origin (m origin))
    (painter (make-frame new-origin
                         (sub-vect (m corner1) new-origin)
                         (sub-vect (m corner2) new-origin)))))
 
(define (flip-horiz painter)
  (transform-painter painter
                     (make-vect 1 0)
                     (make-vect 0 0)
                     (make-vect 1 1)))
 
(define (rotate180 painter)
  (transform-painter painter
                     (make-vect 1 1)
                     (make-vect 0 1)
                     (make-vect 1 0)))
 
(define (rotate270 painter)
  (transform-painter painter
                     (make-vect 1 0)
                     (make-vect 1 1)
                     (make-vect 0 0)))
 
;;;;;;;;;;
;; 2.51 ;;
;;;;;;;;;;
 
(define (rotate90 painter)
  (transform-painter painter
                     (make-vect 0 1)
                     (make-vect 0 0)
                     (make-vect 1 1)))
 
(define (new-below painter1 painter2)
  (rotate90 (beside (rotate270 painter1)
                    (rotate270 painter2))))
 
;;;;;;;;;;
;; 2.52 ;;
;;;;;;;;;;
 
(define hat-segment (make-segment (make-vect 5/16 1/16)
                                  (make-vect 11/16 1/16)))
;; (define hat-wave (segments->painter (cons hat-segment wave-segments)))
 
(define (new-corner-split painter n)
  (cond [(zero? n) painter]
        [else
          (define smaller-up (up-split painter (sub1 n)))
          (define smaller-right (right-split painter (sub1 n)))
          (below (beside painter
                         smaller-right)
                 (beside smaller-up
                         (new-corner-split painter (sub1 n))))]))
 
(define (square-of-four tl tr bl br)
  (lambda (painter)
    (define top (beside (tl painter) (tr painter)))
    (define bottom (beside (bl painter) (br painter)))
    (below bottom top)))
 
(define (my-identity painter)
  painter)
 
(define (flip-vert painter)
  (transform-painter painter
                     (make-vect 0 1)
                     (make-vect 1 1)
                     (make-vect 0 0)))
 
(define (corner-split painter n)
  (cond [(zero? n) painter]
        [else
          (define up (up-split painter (sub1 n)))
          (define right (right-split painter (sub1 n)))
          (define top-left (beside up up))
          (define bottom-right (below right right))
          (define corner (corner-split painter (sub1 n)))
          (beside (below painter top-left)
                  (below bottom-right corner))]))
 
(define (new-square-limit painter n)
  (define combine4 (square-of-four flip-horiz
                                   my-identity
                                   rotate180
                                   flip-vert))
  (combine4 (corner-split painter n)))

Comments