Doing 2.49

master Yann Esposito (Yogsototh) 11 years ago
parent
commit
85f1830f6b
4 changed files with 141 additions and 12 deletions
1. 39
2.47.scm
2. 49
2.48.scm
3. 10
2.49.scm
4. 55
imagelib.scm

39 2.47.scm View File

 @ -1,11 +1,14 @@ (load "displaylib.scm") (title "Exercise 2.46") (doc "A two-dimensional vector v running from the origin to a point can be represented as a pair consisting of an x-coordinate and a y-coordinate. Implement a data abstraction for vectors by giving a constructor make-vect and corresponding selectors xcor-vect and ycor-vect. In terms of your selectors and constructor, implement procedures add-vect, sub-vect, and scale-vect that perform the operations vector addition, vector subtraction, and multiplying a vector by a scalar: (x1,y1) + (x2,y2) = (x1+x2 , y1+y2) (x1,y1) - (x2,y2) = (x1-x2 , y1-y2) s . (x,y) = (sx, sy) ") (title "Exercise 2.47") (doc "Here are two possible constructors for frames: (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) (define (make-frame origin edge1 edge2) (cons origin (cons edge1 edge2))) For each constructor supply the appropriate selectors to produce an implementation for frames.") (define (make-vect x y) (list x y)) (define (xcor-vect v) (car v)) @ -27,17 +30,29 @@ (define half-half (make-vect 0.5 0.5)) ; ------------------------ (print "List representation") (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) (define (origin-frame f) (car f)) (define (edge1-frame f) (cadr f)) (define (edge1-frame f) (caddr f)) (print (make-frame origin xunit yunit)) (define (edge2-frame f) (caddr f)) (define frame (make-frame origin xunit yunit)) (display frame)(newline) (display (origin-frame frame))(newline) (display (edge1-frame frame))(newline) (display (edge2-frame frame))(newline) (newline) (print "Cons representation") (define (make-frame-cons origin edge1 edge2) (cons origin (cons edge1 edge2))) (define (origin-frame-cons f) (car f)) (define (edge1-frame-cons f) (car (cdr f)) (define (edge1-frame-cons f) (cdr (cdr f)) (define (edge1-frame-cons f) (car (cdr f))) (define (edge2-frame-cons f) (cdr (cdr f))) (define frame-cons (make-frame-cons origin xunit yunit)) (display frame-cons)(newline) (display (origin-frame-cons frame-cons))(newline) (display (edge1-frame-cons frame-cons))(newline) (display (edge2-frame-cons frame-cons))(newline)

49 2.48.scm View File

 @ -0,0 +1,49 @@ (load "displaylib.scm") (title "Exercise 2.48") (doc "A directed line segment in the plane can be represented as a pair of vectors -- the vector running from the origin to the start-point of the segment, and the vector running from the origin to the end-point of the segment. Use your vector representation from exercise 2.46 to define a representation for segments with a constructor make-segment and selectors start-segment and end-segment.") ; --- Vectors 2.46 --- (define (make-vect x y) (list x y)) (define (xcor-vect v) (car v)) (define (ycor-vect v) (cadr v)) (define (add-vect v w) (make-vect (+ (xcor-vect v) (xcor-vect w)) (+ (ycor-vect v) (ycor-vect w)))) (define (sub-vect v w) (make-vect (- (xcor-vect v) (xcor-vect w)) (- (ycor-vect v) (ycor-vect w)))) (define (scale-vect s v) (make-vect (* s (xcor-vect v)) (* s (ycor-vect v)))) (define origin (make-vect 0 0)) (define one-one (make-vect 1 1)) (define xunit (make-vect 1 0)) (define yunit (make-vect 0 1)) (define half-half (make-vect 0.5 0.5)) ; -- Frames 2.47 -- ; --- frame with list representation --- (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) (define (origin-frame f) (car f)) (define (edge1-frame f) (cadr f)) (define (edge2-frame f) (caddr f)) ; --- frame with cons representation --- (define (make-frame-cons origin edge1 edge2)(cons origin (cons edge1 edge2))) (define (origin-frame-cons f) (car f)) (define (edge1-frame-cons f) (car (cdr f))) (define (edge2-frame-cons f) (cdr (cdr f))) ; --------------------- ; START ; --------------------- (define (make-segment start end) (list start end)) (define (start-segment s) (car s)) (define (end-segment s) (cadr s)) (print "START") (define segment (make-segment half-half one-one)) (display segment)(newline) (display (start-segment segment))(newline) (display (end-segment segment))(newline)

10 2.49.scm View File

 @ -0,0 +1,10 @@ (load "displaylib.scm") (load "imagelib.scm") (title "Exercise 2.49") (doc "Use segments->painter to define the following primitive painters: a. The painter that draws the outline of the designated frame. b. The painter that draws an ``X'' by connecting opposite corners of the frame. c. The painter that draws a diamond shape by connecting the midpoints of the sides of the frame. d. The wave painter.") ; Exercise start

55 imagelib.scm View File

 @ -0,0 +1,55 @@ ; --- Vectors 2.46 --- (define (make-vect x y) (list x y)) (define (xcor-vect v) (car v)) (define (ycor-vect v) (cadr v)) (define (add-vect v w) (make-vect (+ (xcor-vect v) (xcor-vect w)) (+ (ycor-vect v) (ycor-vect w)))) (define (sub-vect v w) (make-vect (- (xcor-vect v) (xcor-vect w)) (- (ycor-vect v) (ycor-vect w)))) (define (scale-vect s v) (make-vect (* s (xcor-vect v)) (* s (ycor-vect v)))) (define origin (make-vect 0 0)) (define one-one (make-vect 1 1)) (define xunit (make-vect 1 0)) (define yunit (make-vect 0 1)) (define half-half (make-vect 0.5 0.5)) ; -- Frames 2.47 -- ; --- frame with list representation --- (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) (define (origin-frame f) (car f)) (define (edge1-frame f) (cadr f)) (define (edge2-frame f) (caddr f)) ; --- frame with cons representation --- (define (make-frame-cons origin edge1 edge2)(cons origin (cons edge1 edge2))) (define (origin-frame-cons f) (car f)) (define (edge1-frame-cons f) (car (cdr f))) (define (edge2-frame-cons f) (cdr (cdr f))) ; --- frame segment --- (define (make-segment start end) (list start end)) (define (start-segment s) (car s)) (define (end-segment s) (cadr s)) ; -- defined function from SICP text (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)))