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)As a two-dimensional vector has only two pieces of data associated with it, the x- and y-coordinates, it lends itself naturally to being represented as a pair. Let's put x as the first elements, and y as the second. We can then access them via
car
and cdr
respectively:
(define (make-vect x y) (cons x y)) (define (xcor-vect v) (car v)) (define (ycor-vect v) (cdr v))Given this representation (or at least this constructor and these selectors), we can implement the given operations straightforwardly. We simply need to extract the x- and y-coordinates from the vectors we're dealing with using the selectors, perform the appropriate mathematical operations on them and then create a new vector as our result using the constructor:
(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))))Let's see them in action:
> (define v1 (make-vect 4 5)) > (define v2 (make-vect 7 3)) > v1 '(4 . 5) > v2 '(7 . 3) > (xcor-vect v1) 4 > (ycor-vect v1) 5 > (ycor-vect v2) 3 > (xcor-vect v2) 7 > (add-vect v1 v2) '(11 . 8) > (add-vect v2 v1) '(11 . 8) > (sub-vect v1 v2) '(-3 . 2) > (sub-vect v2 v1) '(3 . -2) > (scale-vect 3 v1) '(12 . 15) > (scale-vect 2 v2) '(14 . 6)
No comments:
Post a Comment