Advertisement
timothy235

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

Feb 23rd, 2016
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 8.11 KB | None | 0 0
  1. #lang racket
  2.  
  3. ;;;;;;;;;;
  4. ;; 2.44 ;;
  5. ;;;;;;;;;;
  6.  
  7. (define (below painter1 painter2)
  8.   (define split-point (make-vect 0 1/2))
  9.   (define paint-below (transform-painter painter1
  10.                                          split-point
  11.                                          (make-vect 1 1/2)
  12.                                          (make-vect 0 1)))
  13.   (define paint-above (transform-painter painter2
  14.                                          (make-vect 0 0)
  15.                                          (make-vect 1 0)
  16.                                          split-point))
  17.   (lambda (frame)
  18.     (paint-below frame)
  19.     (paint-above frame)))
  20.  
  21. (define (beside painter1 painter2)
  22.   (define split-point (make-vect 1/2 0))
  23.   (define paint-left (transform-painter painter1
  24.                                         (make-vect 0 0)
  25.                                         split-point
  26.                                         (make-vect 0 1)))
  27.   (define paint-right (transform-painter painter2
  28.                                          split-point
  29.                                          (make-vect 1 0)
  30.                                          (make-vect 1/2 1)))
  31.   (lambda (frame)
  32.     (begin (paint-left frame)
  33.            (paint-right frame))))
  34.  
  35. (define (up-split painter n)
  36.   (cond [(zero? n) painter]
  37.         [else
  38.           (define smaller (up-split painter (sub1 n)))
  39.           (below painter (beside smaller smaller))]))
  40.  
  41. ;;;;;;;;;;
  42. ;; 2.45 ;;
  43. ;;;;;;;;;;
  44.  
  45. (define (split comb1 comb2)
  46.   (lambda (painter n)
  47.     (cond [(zero? n) painter]
  48.           [else
  49.             (define smaller ((split comb1 comb2) painter (sub1 n)))
  50.             (comb1 painter (comb2 smaller smaller))])))
  51.  
  52. (define right-split (split beside below))
  53. (define new-up-split (split below beside))
  54.  
  55. ;;;;;;;;;;
  56. ;; 2.46 ;;
  57. ;;;;;;;;;;
  58.  
  59. (define (make-vect x y) (list x y))
  60. (define (xcor-vect v) (first v))
  61. (define (ycor-vect v) (second v))
  62. (define (add-vect v1 v2)
  63.   (make-vect
  64.     (+ (xcor-vect v1) (xcor-vect v2))
  65.     (+ (ycor-vect v1) (ycor-vect v2))))
  66. (define (sub-vect v1 v2)
  67.   (make-vect
  68.     (- (xcor-vect v1) (xcor-vect v2))
  69.     (- (ycor-vect v1) (ycor-vect v2))))
  70. (define (scale-vect s v)
  71.   (make-vect
  72.     (* s (xcor-vect v))
  73.     (* s (ycor-vect v))))
  74.  
  75. ;;;;;;;;;;
  76. ;; 2.47 ;;
  77. ;;;;;;;;;;
  78.  
  79. (define (make-frame origin edge1 edge2)
  80.   (list origin edge1 edge2))
  81. (define (origin-frame frame)
  82.   (first frame))
  83. (define (edge1-frame frame)
  84.   (second frame))
  85. (define (edge2-frame frame)
  86.   (third frame))
  87.  
  88. ;; It is a Racket error to use first and rest with dotted pairs.  first and rest
  89. ;; can only be used with lists.  Use car and cdr for dotted pairs.
  90.  
  91. ;; (define (make-frame origin edge1 edge2)
  92.   ;; (cons origin (cons edge1 edge2)))
  93. ;; (define (origin-frame frame)
  94.   ;; (car frame))
  95. ;; (define (edge1-frame frame)
  96.   ;; (car (cdr frame)))
  97. ;; (define (edge2-frame frame)
  98.   ;; (cdr (cdr frame)))
  99.  
  100.  
  101. ;;;;;;;;;;
  102. ;; 2.48 ;;
  103. ;;;;;;;;;;
  104.  
  105. (define (make-segment v1 v2)
  106.   (list v1 v2))
  107. (define (start-segment segment)
  108.   (first segment))
  109. (define (end-segment segment)
  110.   (second segment))
  111.  
  112. ;;;;;;;;;;
  113. ;; 2.49 ;;
  114. ;;;;;;;;;;
  115.  
  116. ;; segments->painter not implemented in this file
  117.  
  118. (define outline-segments
  119.   (list (make-segment (make-vect 0 0)
  120.                       (make-vect 0 1))
  121.         (make-segment (make-vect 0 0)
  122.                       (make-vect 1 0))
  123.         (make-segment (make-vect 0 1)
  124.                       (make-vect 1 1))
  125.         (make-segment (make-vect 1 0)
  126.                       (make-vect 1 1))))
  127. ;; (define outline-painter (segments->painter outline-segments))
  128.  
  129. (define x-segments
  130.   (list (make-segment (make-vect 0 0)
  131.                       (make-vect 1 1))
  132.         (make-segment (make-vect 0 1)
  133.                       (make-vect 1 0))))
  134. ;; (define x-painter (segments->painter x-segments))
  135.  
  136. (define diamond-segments
  137.   (list (make-segment (make-vect 1/2 0)
  138.                       (make-vect 1 1/2))
  139.         (make-segment (make-vect 1 1/2)
  140.                       (make-vect 1/2 1))
  141.         (make-segment (make-vect 1/2 0)
  142.                       (make-vect 0 1/2))
  143.         (make-segment (make-vect 0 1/2)
  144.                       (make-vect 1/2 1))))
  145. ;; (define diamond-painter (segments->painter diamond-segments))
  146.  
  147. (define wave-segments
  148.   (list
  149.     ; head
  150.     (make-segment (make-vect 3/8 0)
  151.                   (make-vect 5/8 0))
  152.     (make-segment (make-vect 3/8 0)
  153.                   (make-vect 3/8 1/4))
  154.     (make-segment (make-vect 3/8 1/4)
  155.                   (make-vect 5/8 1/4))
  156.     (make-segment (make-vect 5/8 0)
  157.                   (make-vect 5/8 1/4))
  158.     ; arms
  159.     (make-segment (make-vect 0 1/4)
  160.                   (make-vect 1 3/4))
  161.     ; body
  162.     (make-segment (make-vect 1/2 1/4)
  163.                   (make-vect 1/2 3/4))
  164.     ; legs
  165.     (make-segment (make-vect 1/4 1)
  166.                   (make-vect 1/2 3/4))
  167.     (make-segment (make-vect 1/2 3/4)
  168.                   (make-vect 3/4 1))))
  169. ;; (define wave (segments->painter wave-segments))
  170.  
  171. ;;;;;;;;;;
  172. ;; 2.50 ;;
  173. ;;;;;;;;;;
  174.  
  175. (define (frame-coord-map frame)
  176.   (lambda (v)
  177.     (add-vect
  178.       (origin-frame frame)
  179.       (add-vect (scale-vect (xcor-vect v)
  180.                             (edge1-frame frame))
  181.                 (scale-vect (ycor-vect v)
  182.                             (edge2-frame frame))))))
  183.  
  184. (define (transform-painter painter origin corner1 corner2)
  185.   (lambda (frame)
  186.     (define m (frame-coord-map frame))
  187.     (define new-origin (m origin))
  188.     (painter (make-frame new-origin
  189.                          (sub-vect (m corner1) new-origin)
  190.                          (sub-vect (m corner2) new-origin)))))
  191.  
  192. (define (flip-horiz painter)
  193.   (transform-painter painter
  194.                      (make-vect 1 0)
  195.                      (make-vect 0 0)
  196.                      (make-vect 1 1)))
  197.  
  198. (define (rotate180 painter)
  199.   (transform-painter painter
  200.                      (make-vect 1 1)
  201.                      (make-vect 0 1)
  202.                      (make-vect 1 0)))
  203.  
  204. (define (rotate270 painter)
  205.   (transform-painter painter
  206.                      (make-vect 1 0)
  207.                      (make-vect 1 1)
  208.                      (make-vect 0 0)))
  209.  
  210. ;;;;;;;;;;
  211. ;; 2.51 ;;
  212. ;;;;;;;;;;
  213.  
  214. (define (rotate90 painter)
  215.   (transform-painter painter
  216.                      (make-vect 0 1)
  217.                      (make-vect 0 0)
  218.                      (make-vect 1 1)))
  219.  
  220. (define (new-below painter1 painter2)
  221.   (rotate90 (beside (rotate270 painter1)
  222.                     (rotate270 painter2))))
  223.  
  224. ;;;;;;;;;;
  225. ;; 2.52 ;;
  226. ;;;;;;;;;;
  227.  
  228. (define hat-segment (make-segment (make-vect 5/16 1/16)
  229.                                   (make-vect 11/16 1/16)))
  230. ;; (define hat-wave (segments->painter (cons hat-segment wave-segments)))
  231.  
  232. (define (new-corner-split painter n)
  233.   (cond [(zero? n) painter]
  234.         [else
  235.           (define smaller-up (up-split painter (sub1 n)))
  236.           (define smaller-right (right-split painter (sub1 n)))
  237.           (below (beside painter
  238.                          smaller-right)
  239.                  (beside smaller-up
  240.                          (new-corner-split painter (sub1 n))))]))
  241.  
  242. (define (square-of-four tl tr bl br)
  243.   (lambda (painter)
  244.     (define top (beside (tl painter) (tr painter)))
  245.     (define bottom (beside (bl painter) (br painter)))
  246.     (below bottom top)))
  247.  
  248. (define (my-identity painter)
  249.   painter)
  250.  
  251. (define (flip-vert painter)
  252.   (transform-painter painter
  253.                      (make-vect 0 1)
  254.                      (make-vect 1 1)
  255.                      (make-vect 0 0)))
  256.  
  257. (define (corner-split painter n)
  258.   (cond [(zero? n) painter]
  259.         [else
  260.           (define up (up-split painter (sub1 n)))
  261.           (define right (right-split painter (sub1 n)))
  262.           (define top-left (beside up up))
  263.           (define bottom-right (below right right))
  264.           (define corner (corner-split painter (sub1 n)))
  265.           (beside (below painter top-left)
  266.                   (below bottom-right corner))]))
  267.  
  268. (define (new-square-limit painter n)
  269.   (define combine4 (square-of-four flip-horiz
  270.                                    my-identity
  271.                                    rotate180
  272.                                    flip-vert))
  273.   (combine4 (corner-split painter n)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement