docs: def exvp(x, y, x0, y0, c2, c4, theta0, ff):
      """Convert virtual pixel(s) to real pixel(s).
  
      This function makes use of exvp_scalar(), which performs the
      conversion for a single point (x, y), over an array of X and Y
      values.
  
      Parameters
      ----------
      x : array-like
          X coordinate (pixel).
      y : array-like
          Y coordinate (pixel).
      x0 : float
          X coordinate of reference pixel.
      y0 : float
          Y coordinate of reference pixel.
      c2 : float
          Coefficient corresponding to the term r**2 in distortion
          equation.
      c4 : float
          Coefficient corresponding to the term r**4 in distortion
          equation.
      theta0 : float
          Additional rotation angle (radians).
      ff : float
          Scaling factor to be applied to the Y axis.
  
      Returns
      -------
      xdist, ydist : tuple of floats (or two arrays of floats)
          Distorted coordinates.
  
      """
  
      if all([np.isscalar(x), np.isscalar(y)]):
          xdist, ydist = exvp_scalar(x, y, x0=x0, y0=y0,
                                     c2=c2, c4=c4, theta0=theta0, ff=ff)
          return xdist, ydist
      elif any([np.isscalar(x), np.isscalar(y)]):
          raise ValueError("invalid mixture of scalars and arrays")
      else:
          xdist = []
          ydist = []
          for x_, y_ in zip(x, y):
              xdist_, ydist_ = exvp_scalar(x_, y_, x0=x0, y0=y0,
                                           c2=c2, c4=c4, theta0=theta0, ff=ff)
              xdist.append(xdist_)
              ydist.append(ydist_)
          return np.array(xdist), np.array(ydist)