summaryrefslogtreecommitdiff
path: root/shared/pict.rkt
blob: aa46f3c869c3447b50dedbbbe57ffe0ace2b44e8 (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#lang racket
(provide
  make-vect
  xcor-vect
  ycor-vect
  add-vect
  sub-vect
  scale-vect
  test-vect
  origin-frame
  edge1-frame
  edge2-frame
  test-frame
  make-segment
  start-segment
  end-segment
  paint
  segments->painter
  transform-painter
  beside
  einstein
  flip-horiz
  flip-vert
  <-rotate180
  <-rotate270
  enumerate-corners
  enumerate-segments
  close-line
  line-points->segments
  up-split
  right-split
  below
  square-of-four)
(require sicp-pict "lists.rkt")

(define (xcor-vect v)
  (vector-xcor v))
(define (ycor-vect v)
  (vector-ycor v))

(define (add-vect . v)
  (make-vect
    (fold-right + 0 (map xcor-vect v))
    (fold-right + 0 (map ycor-vect v))))
(define (sub-vect . v)
  (let ((xcors (map xcor-vect v))
        (ycors (map ycor-vect v)))
   (make-vect
     (- (car xcors) (fold-right + 0 (cdr xcors)))
     (- (car ycors) (fold-right + 0 (cdr ycors))))))
(define (scale-vect s v)
  (make-vect (* s (xcor-vect v))
             (* s (ycor-vect v))))
(define test-vect (make-vect 1 2))

(define (origin-frame frame)
  (frame-origin frame))
(define (edge1-frame frame)
  (frame-edge1 frame))
(define (edge2-frame frame)
  (frame-edge2 frame))
(define test-frame (make-frame
                     (make-vect 1 2)
                     (make-vect 2 4)
                     (make-vect 3 6)))

(define (start-segment s)
  (segment-start s))
(define (end-segment s)
  (segment-end s))

(define (flip-horiz painter)
  (transform-painter
    painter
    (make-vect 1 0)
    (make-vect 0 0)
    (make-vect 1 1)))

(define (flip-vert painter)
  (transform-painter
   painter
   (make-vect 0 1)
   (make-vect 1 1)
   (make-vect 0 0)))

(define (<-rotate180 painter)
  (flip-horiz (flip-vert painter)))
(define (<-rotate270 painter)
  (transform-painter
   painter
   (make-vect 0 1)
   (make-vect 0 0)
   (make-vect 1 1)))


(define (enumerate-corners frame)
  (list
    (origin-frame frame)
    (edge1-frame frame)
    (add-vect
      (edge1-frame frame)
      (edge2-frame frame))
    (edge2-frame frame)))

(define (close-line line-points)
  (append line-points (list (car line-points))))

(define (enumerate-segments frame)
  (map
    (lambda (pair)
      (make-segment (car pair) (cadr pair)))
    (enumerate-windows
      (close-line (enumerate-corners frame))
      2)))

(define (line-points->segments points)
  (map
   (lambda (pair)
     (make-segment (car pair) (cadr pair)))
   (enumerate-windows
     points
     2)))


(define (right-split painter n)
  (if (= n 0)
    painter
    (let ((smaller (right-split painter (- n 1))))
      (beside smaller (below smaller smaller)))))

(define (up-split painter n)
  (if (= n 0)
    painter
    (let ((smaller (up-split painter (- n 1))))
      (below smaller (beside smaller smaller)))))

(define (square-of-four tl tr bl br)
  (lambda (painter)
    (let ((t (beside (tl painter) (tr painter)))
          (b (beside (bl painter) (br painter))))
      (below b t))))