class Vec3D:
      EPS = 1E-6
      def __init__(self, x=0., y=0., z=0.):
            self.x = x
            self.y = y
            self.z = z
            
      def norma(self):
            return (self.x**2 + self.y**2 + self.z**2)**0.5
        
      def normalitza(self):
          n = self.norma()
          return Vec3D(self.x/n, self.y/n, self.z/n)

      def __getitem__(self, i):
          if i == 0:
              return self.x
          elif i == 1:
              return self.y
          elif i == 2:
              return self.z
          else:
              raise  Exception("l'índex ha de ser entre 0 i 2", IndexError)
          
      def __setitem__(self, i, valor):
          if i == 0:
              self.x = valor
          elif i == 1:
              self.y = valor
          elif i == 2:
              self.z = valor
          else:
              raise Exception("l'índex ha de ser entre 0 i 2", IndexError)
                
      def __add__(self, v):
          return Vec3D(self.x + v.x, self.y + v.y, self.z + v.z)
      def __sub__(self, v):
          return Vec3D(self.x - v.x, self.y - v.y, self.z - v.z)
      def __rmul__(self, k):
          return Vec3D(k*self.x, k*self.y, k*self.z)
      def __mul__(self, v):
          return self.x *v.x + self.y*v.y + self.z*v.z

      def __neg__(self):
            return Vec3D(-self.x, -self.y, -self.z)

      def __eq__(self, v):
            return abs(self.x - v.x) < self.EPS and abs(self.y - v.y) < self.EPS and abs(self.z - v.z) < self.EPS
      def __le__(self, v):
            return self.norma() <= v.norma()
      def __lt__(self, v):
            return self.norma() < v.norma()
      def __ge__(self, v):
            return self.norma() >= v.norma()
      def __gt__(self, v):
            return self.norma() > v.norma()        

      def __str__(self):
            return "({:.1f}, {:.1f}, {:.1f})".format(self.x, self.y, self.z)
      def __repr__(self):
            return "Vec3D({:.2f}, {:.2f}, {:.2f})".format(self.x, self.y, self.z)

