NodeEntry<T>[] node = new NodeEntry[bigM + 1]; for ( int i = 0; i < rects.size(); ++i ) { node[i] = new NodeEntry<T>(); node[i].bbox = rects.get( i ).first; if ( rects.get( i ).second instanceof NodeEntry<?>[] ) { node[i] = new NodeEntry<T>(); node[i].bbox = p.first; if ( p.second instanceof NodeEntry<?>[] ) {
if ( traceIndex < 0 ) { parent = new NodeEntry[bigM + 1]; parent[0] = new NodeEntry<T>(); root = parent; parentIndex = 0; parent[parentIndex].next = leftEntries; NodeEntry<T> newEntry = new NodeEntry<T>(); int nRightEntries = lastNotNull( rightEntries ); newEntry.bbox = mbb( copyBoxesFromRange( rightEntries, 0, nRightEntries + 1 ) );
/** * @throws IOException */ @SuppressWarnings("unchecked") private NodeEntry<T>[] loadNodeFromDisk( DataInputStream dis ) throws IOException { // the number of non-null entries in this node int n = dis.readInt(); NodeEntry<T>[] node = null; try { node = new NodeEntry[bigM + 1]; } catch ( OutOfMemoryError e ) { LOG.error( "Out of memory when reading rtree." ); throw new IOException( "out of memory" ); } for ( int i = 0; i < n; i++ ) { node[i] = new NodeEntry<T>(); node[i].bbox = loadBboxFromDisk( dis ); Long value = dis.readLong(); if ( Long.MIN_VALUE == value ) { node[i].entryValue = null; node[i].next = loadNodeFromDisk( dis ); } else { node[i].entryValue = (T) value; } } return node; }
@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 ); } }
@SuppressWarnings("unchecked") @Override public boolean insert( float[] insertBox, T object ) { if ( root == null || hasNullEntries( root ) ) { NodeEntry newEntry = new NodeEntry(); newEntry.bbox = insertBox; newEntry.entryValue = object; newEntry.next = null; root = new RTree.NodeEntry[bigM + 1]; root[0] = newEntry; return true; } insertNode( insertBox, object, root ); return true; }