/** * Calculate "maximum perimeter" constant for a node to be split: 2 times the perimeter of the minimum bounding box * of all bigM + 1 bboxes minus the shortest axis length * * @param boxes */ private double calculatePerimMax( float[][] boxes ) { float[] overfilledBox = mbb( boxes ); double result = 2 * calculatePerimeter( overfilledBox ); double xLength = 2 * ( overfilledBox[2] - overfilledBox[0] ); double yLength = 2 * ( overfilledBox[3] - overfilledBox[1] ); if ( xLength < yLength ) { return result - xLength; } return result - yLength; }
/** * @param insertBox */ private double calculatePerimOverlap( float[] box1, float[] box2, float[] insertBox ) { double perim1; try { perim1 = calculatePerimeter( calculateIntersection( mbbIncludeInsertBox( box1, insertBox ), box2 ) ); } catch ( NoOverlapException e ) { perim1 = 0.0; } double perim2; try { perim2 = calculatePerimeter( calculateIntersection( box1, box2 ) ); } catch ( NoOverlapException e ) { perim2 = 0.0; } return perim1 - perim2; }
/** * Calculate the value of the goal function when the splitting at position i. * * @param leftSide * @param rightSide */ private double wgFunction( float[][] leftSide, float[][] rightSide ) { double result; try { result = calculatePerimeter( calculateIntersection( mbb( leftSide ), mbb( rightSide ) ) ); } catch ( NoOverlapException e ) { float[][] all = new float[leftSide.length + rightSide.length][]; // Arrays.copyOf does not work for ( int i = 0; i < leftSide.length; i++ ) { all[i] = leftSide[i]; } System.arraycopy( rightSide, 0, all, leftSide.length, rightSide.length ); result = calculatePerimeter( mbb( leftSide ) ) + calculatePerimeter( mbb( rightSide ) ) - calculatePerimMax( all ); } return result; }
for ( int i = smallm - 1; i <= bigM + 1 - smallm; i++ ) { float[][] boxes = copyBoxesFromRange( entries, 0, i + 1 ); perimX += calculatePerimeter( mbb( boxes ) ); perimX += calculatePerimeter( mbb( boxes ) ); for ( int i = smallm; i <= bigM + 1 - smallm; i++ ) { float[][] boxes = copyBoxesFromRange( entries, 0, i + 1 ); perimY += calculatePerimeter( mbb( boxes ) ); perimY += calculatePerimeter( mbb( boxes ) );
deltaPerim[i] = calculatePerimeter( mbbIncludeInsertBox( entries[i].bbox, insertBox ) ) - calculatePerimeter( entries[i].bbox );