#include #include #include "generate-constraints.h" #include "solve_VPSC.h" #include "variable.h" #include "constraint.h" #ifdef RECTANGLE_OVERLAP_LOGGING using std::ios; using std::ofstream; using std::endl; #endif #define EXTRA_GAP 0.0001 double Rectangle::xBorder=0; double Rectangle::yBorder=0; /** * Takes an array of n rectangles and moves them as little as possible * such that rectangles are separated by at least xBorder horizontally * and yBorder vertically * * Works in three passes: * 1) removes some overlap horizontally * 2) removes remaining overlap vertically * 3) a last horizontal pass removes all overlap starting from original * x-positions - this corrects the case where rectangles were moved * too much in the first pass. */ void removeRectangleOverlap(Rectangle *rs[], int n, double xBorder, double yBorder) { assert(0 <= n); try { // The extra gap avoids numerical imprecision problems Rectangle::setXBorder(xBorder+EXTRA_GAP); Rectangle::setYBorder(yBorder+EXTRA_GAP); double *ws=new double[n]; for(int i=0;idesiredPosition; } VPSC vpsc_x(vs,n,cs,m); #ifdef RECTANGLE_OVERLAP_LOGGING ofstream f(LOGFILE,ios::app); f<<"Calling VPSC: Horizontal pass 1"<moveCentreX(vs[i]->position()); delete vs[i]; } delete [] vs; for(int i = 0; i < m; ++i) { delete cs[i]; } delete [] cs; // Removing the extra gap here ensures things that were moved to be adjacent to // one another above are not considered overlapping Rectangle::setXBorder(Rectangle::xBorder-EXTRA_GAP); m=generateYConstraints(rs,ws,n,vs,cs); VPSC vpsc_y(vs,n,cs,m); #ifdef RECTANGLE_OVERLAP_LOGGING f.open(LOGFILE,ios::app); f<<"Calling VPSC: Vertical pass"<moveCentreY(vs[i]->position()); rs[i]->moveCentreX(oldX[i]); delete vs[i]; } delete [] vs; delete [] oldX; for(int i = 0; i < m; ++i) { delete cs[i]; } delete [] cs; Rectangle::setYBorder(Rectangle::yBorder-EXTRA_GAP); m=generateXConstraints(rs,ws,n,vs,cs,false); VPSC vpsc_x2(vs,n,cs,m); #ifdef RECTANGLE_OVERLAP_LOGGING f.open(LOGFILE,ios::app); f<<"Calling VPSC: Horizontal pass 2"<moveCentreX(vs[i]->position()); delete vs[i]; } delete [] vs; for(int i = 0; i < m; ++i) { delete cs[i]; } delete [] cs; delete [] ws; } catch (char *str) { std::cerr<