double perimX = 0.0; for ( int i = smallm - 1; i <= bigM + 1 - smallm; i++ ) { float[][] boxes = copyBoxesFromRange( entries, 0, i + 1 ); perimX += calculatePerimeter( mbb( boxes ) ); boxes = copyBoxesFromRange( entries, i, bigM + 1 ); perimX += calculatePerimeter( mbb( boxes ) ); double perimY = 0.0; for ( int i = smallm; i <= bigM + 1 - smallm; i++ ) { float[][] boxes = copyBoxesFromRange( entries, 0, i + 1 ); perimY += calculatePerimeter( mbb( boxes ) ); boxes = copyBoxesFromRange( entries, i, bigM + 1 ); perimY += calculatePerimeter( mbb( boxes ) );
parent[parentIndex].bbox = mbb( copyBoxesFromRange( leftEntries, 0, nLeftEntries + 1 ) ); parent[parentIndex].next = leftEntries; newEntry.bbox = mbb( copyBoxesFromRange( rightEntries, 0, nRightEntries + 1 ) ); newEntry.next = rightEntries; parent[parentIndex].bbox = mbb( copyBoxesFromRange( leftEntries, 0, nLeftEntries ) );
/** * Choose the index at which the entries shall be split when inserting insertBox. * * @param entries * @param insertBox * @param object */ private int split( NodeEntry<T>[] entries, float[] insertBox, T object ) { if ( entries[0].next == null ) { // leaf node splitAxis( entries ); } double minValue = Double.MAX_VALUE; int splitIndex = -1; for ( int i = smallm - 1; i < bigM + 1 - smallm; i++ ) { float[][] leftSide = copyBoxesFromRange( entries, 0, i + 1 ); float[][] rightSide = copyBoxesFromRange( entries, i + 1, bigM + 1 ); double currentVal; if ( !intersects( mbb( leftSide ), mbb( rightSide ), 2 ) ) { currentVal = wgFunction( leftSide, rightSide ) * wfFunction( i ); } else { currentVal = wgFunction( leftSide, rightSide ) / wfFunction( i ); } if ( currentVal < minValue ) { minValue = currentVal; splitIndex = i; } } return splitIndex; }
trace[traceIndex].node[entryIndex].bbox = mbb( copyBoxesFromRange( trace[traceIndex - 1].node, 0, trace[traceIndex - 1].node.length ) ); condenseTree( trace, traceIndex + 1, false );