code: protected List createParentBoundables( List childBoundables, int newLevel ) {
          Assert.isTrue(!childBoundables.isEmpty());
          int minLeafCount = (int) Math.ceil((childBoundables.size() / (double) getNodeCapacity()));
          ArrayList sortedChildBoundables = new ArrayList(childBoundables);
          Collections.sort(sortedChildBoundables, xComparator);
          List[] verticalSlices = verticalSlices(sortedChildBoundables, (int) Math.ceil(Math.sqrt(minLeafCount)));
          return createParentBoundablesFromVerticalSlices(verticalSlices, newLevel);
      }
docs: Creates the parent level for the given child level. First, orders the items
  by the x-values of the midpoints, and groups them into vertical slices.
  For each slice, orders the items by the y-values of the midpoints, and
  group them into runs of size M (the node capacity). For each run, creates
  a new (parent) node.