# Vectors 0.0.1 # Copyright 2001-2004 Lja MultiMedia # May be used under the GNU GPL """vectors : basic vector class and related functions""" from __future__ import division import math class vector(tuple): def normalize(self): t = 0 for n in self: t += n l = len(self) r = [None] * l for i in range(l): r[i] = self[i] / t return self.__class__(r) def __add_num(self, num): l = len(self) r = [None] * l for i in range(l): r[i] = self[i] + num return self.__class__(r) def __add_seq(self, seq): l = len(self) assert(l == len(seq)) r = [None] * l for i in range(l): r[i] = self[i] + seq[i] return self.__class__(r) def __add__(self, other): if isinstance(other, (int, long, float)): return self.__add_num(other) elif isinstance(other, (tuple, list)): return self.__add_seq(other) else: raise 'FIXME' def __mul_num(self, num): l = len(self) r = [None] * l for i in range(l): r[i] = self[i] * num return self.__class__(r) def __mul_seq(self, seq): l = len(self) assert(l == len(seq)) r = [None] * l for i in range(l): r[i] = self[i] * seq[i] return self.__class__(r) def __mul__(self, other): if isinstance(other, (int, long, float)): return self.__mul_num(other) elif isinstance(other, (tuple, list)): return self.__mul_seq(other) else: raise 'FIXME' def __neg__(self): l = len(self) r = [None] * l for i in range(l): r[i] = -self[i] return self.__class__(r) def __str__(self): return tuple.__repr__(self) def __repr__(self): return "%s(%s)" % (self.__class__.__name__, tuple.__repr__(self)) def distance(a, b, sq=0): """distance(sequence, sequence) --> float""" l = len(a) assert(len(b) == l) d = 0 for i in range(l): d += (a[i] - b[i]) ** 2 if sq: return d return math.sqrt(d) def direction(a, b): """direction(sequence, sequence) --> vector""" l = len(a) assert(len(b) == l) d = list() for i in range(l): d.append(a[i] - b[i]) return vector(d).normalize() def _test(): a = vector((13, 8)) a2 = eval(repr(a)) assert(a == a2) for b in (a2, (2, -1), 42): print a, '+', b, '=', a + b print vector((3, 3, 3)).normalize() assert(len(a * 0.0) == 2) print 'All tests passed!' if __name__ == "__main__": _test()