/** * Find the right leaf node in which to insert * * @param insertBox * @param entries */ private NodeEntry<T>[] chooseLeaf( float[] insertBox, NodeEntry<T>[] entries, List<TraceCell<T>> trace ) { if ( entries[0].next == null ) { return entries; } int index = chooseSubtree( entries, insertBox ); trace.add( new TraceCell<T>( entries, index ) ); return chooseLeaf( insertBox, entries[index].next, trace ); }
@SuppressWarnings("unchecked") private void insertNode( float[] insertBox, T object, NodeEntry<T>[] entries ) { List<TraceCell<T>> trace = new ArrayList<TraceCell<T>>(); NodeEntry<T>[] leafNode = chooseLeaf( insertBox, entries, trace ); NodeEntry<T> newEntry = new NodeEntry<T>(); newEntry.bbox = insertBox; newEntry.entryValue = object; newEntry.next = null; int index = lastNotNull( leafNode ); leafNode[index + 1] = newEntry; if ( leafNode[bigM] != null ) { int splitIndex = split( leafNode, insertBox, object ); NodeEntry<T>[] addedNode = new NodeEntry[bigM + 1]; Arrays.fill( addedNode, null ); System.arraycopy( leafNode, splitIndex + 1, addedNode, 0, bigM - splitIndex ); Arrays.fill( leafNode, splitIndex + 1, bigM + 1, null ); adjustTree( leafNode, addedNode, trace, trace.size() - 1 ); } else { adjustTree( leafNode, null, trace, trace.size() - 1 ); } }