code: def transform(self, v):
          
          assert(len(v) == 3)
          assert(np.allclose(self.norm, 1))
          # perform transformation t = q * [0, v] * q^-1 but avoid multiplication
          # because terms cancel out
          q0 = self.q[0]
          qi = self.q[1:4]
          ui = np.array(v)
          a = q0 * ui + np.cross(qi, ui)
          t = np.dot(qi, ui) * qi + q0 * a - np.cross(a, qi)
          return t
docs: Calculates the vector transformed by this quaternion
          :param v: array with len 3 to be transformed
          :returns: transformed vector