function _quadRetrieveArea(rectData, quad, collisionFunc, els) {
    els = els || {};

    if (quad.level < quad.maxLevel) {
      var indexes = collisionFunc(rectData, quad.corners);

      for (var i = 0, l = indexes.length; i < l; i++)
        if (quad.nodes[indexes[i]] !== undefined)
          _quadRetrieveArea(
            rectData,
            quad.nodes[indexes[i]],
            collisionFunc,
            els
          );
    } else
      for (var j = 0, m = quad.elements.length; j < m; j++)
        if (els[quad.elements[j].id] === undefined)
          els[quad.elements[j].id] = quad.elements[j];

    return els;
  }
Recursively retrieve every elements contained within an rectangular area
that may or may not be axis-aligned.

@param  {object|array} rectData       The searched area defined either by
                                      an array of four corners (x, y) in
                                      the case of a non-axis-aligned
                                      rectangle or an object with two top
                                      points (x1, y1), (x2, y2) and height.
@param  {object}       quad           The searched quad.
@param  {function}     collisionFunc  The collision function used to search
                                      for node indexes.
@param  {array?}       els            The retrieved elements.
@return {array}                       An array of elements contained in the
                                      area.