-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpicture_language.rt
176 lines (139 loc) · 4.42 KB
/
picture_language.rt
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#lang sicp
(#%require sicp-pict)
(define image (bitmap->painter "test.jpeg"))
;(paint-hires (beside image (flip-vert image)))
;(paint-hires (below (rotate90 image) (flip-vert image)))
;(paint-hires (beside image (beside image (flip-vert image))))
(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)))))
;; ex 2.44 up-split
(define (up-split painter n)
(if (= n 0)
painter
(let ((smaller (up-split painter (- n 1))))
(below painter (beside 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 (flipped-pairs-alt painter)
(let ((combine4 (square-of-four identity flip-vert
identity flip-vert)))
(combine4 painter)))
(define (square-limit-alt painter n)
(let ((combine4 (square-of-four flip-horiz identity
rotate180 flip-vert)))
(combine4 (corner-split painter n))))
;; exercise 2.45
(define (split first second)
(lambda (picture n)
(if (= n 0)
picture
(let ((smaller ((split first second) picture (- n 1))))
(first picture (second smaller smaller))))))
(define right-split-alt (split beside below))
(define up-split-alt (split below beside))
;; ex 2.46
(define (make-vect x y)
(list x y))
(define (xcor-vect vect)
(car vect))
(define (ycor-vect vect)
(cadr vect))
(define (add-vect v1 v2)
(list
(+ (xcor-vect v1) (xcor-vect v2))
(+ (ycor-vect v1) (ycor-vect v2))))
(define (sub-vect v1 v2)
(list
(- (xcor-vect v1) (xcor-vect v2))
(- (ycor-vect v1) (ycor-vect v2))))
(define (scale-vect s v1)
(list
(* s (xcor-vect v1))
(* s (ycor-vect v1))))
;; ex 2.47
(define (make-frame origin edge1 edge2)
(list origin edge1 edge2))
(define (origin-frame frame)
(car frame))
(define (edge1-frame frame)
(cadr frame))
(define (edge2-frame frame)
(caddr frame))
;;alternative way for rapresenting data
(define (make-frame-alt origin edge1 edge2)
(cons origin (cons edge1 edge2)))
(define (origin-frame-alt frame)
(car frame))
(define (edge1-frame-alt frame)
(cadr frame))
(define (edge2-frame-alt frame)
(cdr (cdr frame)))
(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 a-frame (make-frame (make-vect 0 0) (make-vect 1 0) (make-vect 0 1)))
;; Painters
;(define (make-segment v1 v2)
; (list v1 v2))
;(define (start-segment s)
; (car s))
;(define (end-segment s)
; (cadr s))
;(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)))
;; (make-segment (vect 1 1) (vect 0 0))
;;#(struct:segment #(struct:vect 1 1) #(struct:vect 0 0))
;; Exercise 2.49
(define (X)
(segments->painter
(list
(make-segment (vect 0 0) (vect 1 1))
(make-segment (vect 0 1) (vect 1 0)))))
(define (outline-frame)
(segments->painter
(list
(make-segment (vect 0 0) (vect 1 0))
(make-segment (vect 1 0) (vect 1 1))
(make-segment (vect 1 1) (vect 0 1))
(make-segment (vect 0 1) (vect 0 0)))))
(define (diamond-shape)
(segments->painter
(list
(make-segment (vect 0.5 0) (vect 1 0.5))
(make-segment (vect 1 0.5) (vect 0.5 1))
(make-segment (vect 0.5 1) (vect 0 0.5))
(make-segment (vect 0 0.5) (vect 0.5 0)))))