VelocityDb.Collection.Spatial.NodeLeaf.pickNext C# (CSharp) Method

pickNext() private method

private pickNext ( VelocityDb.Collection.Spatial.RTree rTree, NodeLeaf newNode ) : int
rTree VelocityDb.Collection.Spatial.RTree
newNode NodeLeaf
return int
    private int pickNext(RTree rTree, NodeLeaf newNode)
    {
      double maxDifference = double.NegativeInfinity;
      int next = 0;
      int nextGroup = 0;
      maxDifference = double.NegativeInfinity;
#if RtreeCheck
        Console.WriteLine("pickNext()");
#endif
      for (int i = 0; i < rTree.maxNodeEntries; i++)
      {
        if (rTree.entryStatus[i] == ((byte)RTree.EntryStatus.unassigned))
        {
          if (entries[i] == null)
            throw new UnexpectedException("Error: Node " + this + ", entry " + i + " is null");
          Rectangle entryR = entries[i].Value;
          double nIncrease = minimumBoundingRectangle.Enlargement(ref entryR);
          double newNodeIncrease = newNode.minimumBoundingRectangle.Enlargement(ref entryR);
          double difference = Math.Abs(nIncrease - newNodeIncrease);
          if (difference > maxDifference)
          {
            next = i;
            if (nIncrease < newNodeIncrease)
              nextGroup = 0;
            else if (newNodeIncrease < nIncrease)
              nextGroup = 1;
            else if (minimumBoundingRectangle.Area < newNode.minimumBoundingRectangle.Area)
              nextGroup = 0;
            else if (newNode.minimumBoundingRectangle.Area < minimumBoundingRectangle.Area)
              nextGroup = 1;
            else if (newNode.entryCount < rTree.maxNodeEntries / 2)
              nextGroup = 0;
            else
              nextGroup = 1;
            maxDifference = difference;
          }
#if RtreeCheck
            Console.WriteLine("Entry " + i + " group0 increase = " + nIncrease + ", group1 increase = " + newNodeIncrease + ", diff = " + difference + ", MaxDiff = " + maxDifference + " (entry " + next + ")");
#endif
        }
      }
      rTree.entryStatus[next] = ((byte)RTree.EntryStatus.assigned);
      if (nextGroup == 0)
      {
        Update();
        Rectangle r = entries[next].Value;
        if (r.MinX < minimumBoundingRectangle.MinX)
          minimumBoundingRectangle.MinX = r.MinX;
        if (r.MinY < minimumBoundingRectangle.MinY)
          minimumBoundingRectangle.MinY = r.MinY;
        if (r.MaxX > minimumBoundingRectangle.MaxX)
          minimumBoundingRectangle.MaxX = r.MaxX;
        if (r.MaxY > minimumBoundingRectangle.MaxY)
          minimumBoundingRectangle.MaxY = r.MaxY;
        entryCount++;
      }
      else
      {
        // move to new node.
        Rectangle r = entries[next].Value;
        newNode.addEntry(ref r);
        entries[next] = null;
      }
      return next;
    }