Implement the constructor
make-from-mag-ang
in message-passing style. This procedure should be analogous to the make-from-real-imag
procedure given above. Here's the
make-from-real-imag
procedure that's "given above":
(define (make-from-real-imag x y) (define (dispatch op) (cond ((eq? op 'real-part) x) ((eq? op 'imag-part) y) ((eq? op 'magnitude) (sqrt (+ (square x) (square y)))) ((eq? op 'angle) (atan y x)) (else (error "Unknown op -- MAKE-FROM-REAL-IMAG" op)))) dispatch)Now back in section 2.4.1, where the real/imaginary and magnitude/angle representations were introduced, the authors showed how, given a complex number represented as a magnitude, r, and an angle, A, we could calculate the real, x, and imaginary, y, parts as follows:
x = r cos A y = r sin AGiven this, the message-passing style implementation of
make-from-mag-ang
is straightforward. It simply returns r in response to the 'magnitude
operation, A in response to the 'angle
operation, and performs the respective calculations for 'real-part
and 'imag-part
operations:
(define (make-from-mag-ang r a) (define (dispatch op) (cond ((eq? op 'real-part) (* r (cos a))) ((eq? op 'imag-part) (* r (sin a))) ((eq? op 'magnitude) r) ((eq? op 'angle) a) (else (error "Unknown op -- MAKE-FROM-MAG-ANG" op)))) dispatch)Let's give this a spin... First, to make things easy on us we'll define π (to 15 decimal places) and a procedure to convert degrees to radians:
(define pi 3.141592653589793) (define (degrees->radians d) (/ (* d pi) 180))First, we can test the selectors:
> (define a (make-from-mag-ang 2 (degrees->radians 45))) > (define b (make-from-mag-ang 3 0)) > (define c (make-from-mag-ang 2 (degrees->radians 135))) > (magnitude a) 2 > (angle a) 0.7853981633974483 > (real-part a) 1.4142135623730951 > (imag-part a) 1.414213562373095 > (real-part b) 3.0 > (imag-part b) 0.0 > (real-part c) -1.414213562373095 > (imag-part c) 1.4142135623730951Then we can try a few arithmetic operations:
> (define d (add-complex a a)) > (real-part d) 2.8284271247461903 > (imag-part d) 2.82842712474619 > (define e (add-complex a b)) > (real-part e) 4.414213562373095 > (imag-part e) 1.414213562373095 > (define f (sub-complex b a)) > (real-part f) 1.5857864376269049 > (imag-part f) -1.414213562373095 > (define g (mul-complex a b)) > (real-part g) 4.242640687119286 > (imag-part g) 4.242640687119285
No comments:
Post a Comment