import math class Vector: """ Representació de vectors 2D de qualsevol llargada, amb punt d'aplicació (0,0) """ def __init__(self, cx=1.0, cy=0.0): """ Crea un vector, amb coordenades (1,0) per defecte __init__ ha d'afegir els atributs a l'objecte de la classe """ self.x = cx self.y = cy def modul(self): """ Retorna el mòdul (llargada) del vector """ return (self.x ** 2 + self.y ** 2) ** (1/2) def angle(self): """ Retorna l'angle que fa el vector resp. a l'eix horitzontal """ angle = math.atan2(self.y,self.x) return angle def escala(self, fact): """ Escala un vector, multiplicant-lo pel valor real fact """ self.x = self.x * fact self.y = self.y * fact def normalitza(self): """ Normalitza el vector, és a dir, el transforma en un altre vector amb el mateix sentit i orientació però de mòdul 1 """ m = self.modul() self.x = self.x / m self.y = self.y / m # Implementació alternativa: self.escala(1/self.modul()) def suma(self, altre): """ Retorna la suma de vectors """ xn = self.x + altre.x yn = self.y + altre.y vnou = Vector(xn, yn) return vnou def __str__(self): """ Representació d'un vector com un string "Vector::" """ return "Vector::<" + str(self.x) + "," + str(self.y) + ">" def __add__(self, altre): """ Suma de vectors """ return Vector(self.x + altre.x, self.y + altre.y) def __getitem__(self, i): """ Accés a les coordenades x i y usant els índexos 0 i 1 """ if i==0: return self.x elif i==1: return self.y else: raise IndexError # raise provoca un error def __setitem__(self, i, v): """ Accés a les coordenades x i y usant els índexos 0 i 1 """ if i==0: self.x = v elif i==1: self.y = v else: raise IndexError