"""Lecture 17 examples: interfaces and multiple representations""" from ucb import main, trace, interact def add_complex(z1, z2): """Return a complex number z1 + z2""" return ComplexRI(z1.real + z2.real, z1.imag + z2.imag) def mul_complex(z1, z2): """Return a complex number z1 * z2""" return ComplexMA(z1.magnitude * z2.magnitude, z1.angle + z2.angle) from math import atan2, sin, cos class ComplexRI(object): """A rectangular representation of a complex number. >>> from math import pi >>> add_complex(ComplexRI(1, 2), ComplexMA(2, pi/2)) ComplexRI(1.0000000000000002, 4.0) >>> mul_complex(ComplexRI(0, 1), ComplexRI(0, 1)) ComplexMA(1.0, 3.141592653589793) >>> ComplexRI(1, 2) + ComplexMA(2, 0) ComplexRI(3.0, 2.0) >>> ComplexRI(0, 1) * ComplexRI(0, 1) ComplexMA(1.0, 3.141592653589793) """ def __init__(self, real, imag): self.real = real self.imag = imag @property def magnitude(self): return (self.real ** 2 + self.imag ** 2) ** 0.5 @property def angle(self): return atan2(self.imag, self.real) def __repr__(self): return 'ComplexRI({0}, {1})'.format(self.real, self.imag) def __add__(self, other): return add_complex(self, other) def __mul__(self, other): return mul_complex(self, other) class ComplexMA(object): """A polar representation of a complex number.""" def __init__(self, magnitude, angle): self.magnitude = magnitude self.angle = angle @property def real(self): return self.magnitude * cos(self.angle) @property def imag(self): return self.magnitude * sin(self.angle) def __repr__(self): return 'ComplexMA({0}, {1})'.format(self.magnitude, self.angle) def __add__(self, other): return add_complex(self, other) def __mul__(self, other): return mul_complex(self, other) @main def run(): interact()