code: def get_parametric(self, check=True, tolerance=0.001):
          
          if self.parametric is None: 
              
              # Plane calculation
              a, b, c = np.cross(self.points[2,:]-self.points[0,:],
                                 self.points[1,:]-self.points[0,:])
              d = -np.dot(np.array([a, b, c]), self.points[2, :])
              self.parametric = np.array([a, b, c, d])
                  
              # Point belonging verification
              if check:
                  if self.points.shape[0] > 3:
                      if np.min(np.abs(self.points[3:,0]*a+
                                       self.points[3:,1]*b+
                                       self.points[3:,2]*c+
                                       d)) > tolerance:
                          raise ValueError('Polygon not plane: \n'+\
                                           str(self.points))
          return self.parametric
docs: Calculates the parametric equation of the plane that contains 
          the polygon. The output has the form np.array([a, b, c, d]) 
          for:
  
          .. math::
              a*x + b*y + c*z + d = 0
          
          :param check: Checks whether the points are actually
              in the same plane with certain *tolerance*.
          :type check: bool
          :param tolerance: Tolerance to check whether the points belong
              to the same plane.
          :type tolerance: float
          
          .. note:: This method automatically stores the solution in order
              to do not repeat calculations if the user needs to call it 
              more than once.