protected void zSort ( List < ? extends SpatialComparable > objs , int start , int end , double [ ] mms , int [ ] dims , int depth ) { final int numdim = ( dims != null ) ? dims . length : ( mms . length >> 1 ) ; final int edim = ( dims != null ) ? dims [ depth ] : depth ; // Find the splitting points. final double min = mms [ 2 * edim ] , max = mms [ 2 * edim + 1 ] ; double spos = ( min + max ) / 2. ; // Safeguard against duplicate points: if ( max - spos < STOPVAL || spos - min < STOPVAL ) { boolean ok = false ; for ( int d = 0 ; d < numdim ; d ++ ) { int d2 = ( ( dims != null ) ? dims [ d ] : d ) << 1 ; if ( mms [ d2 + 1 ] - mms [ d2 ] >= STOPVAL ) { ok = true ; break ; } } if ( ! ok ) { return ; } } int split = pivotizeList1D ( objs , start , end , edim , spos , false ) ; assert ( start <= split && split <= end ) ; int nextdim = ( depth + 1 ) % numdim ; if ( start < split - 1 ) { mms [ 2 * edim ] = min ; mms [ 2 * edim + 1 ] = spos ; zSort ( objs , start , split , mms , dims , nextdim ) ; } if ( split < end - 1 ) { mms [ 2 * edim ] = spos ; mms [ 2 * edim + 1 ] = max ; zSort ( objs , split , end , mms , dims , nextdim ) ; } // Restore ranges mms [ 2 * edim ] = min ; mms [ 2 * edim + 1 ] = max ; }
The actual Z sorting function