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;
}