From 0623102c16ecbf5ade1a7ef195659826a6f92548 Mon Sep 17 00:00:00 2001 From: Tim Dwyer Date: Wed, 10 May 2006 07:13:45 +0000 Subject: Apparently a problem was reported with one of the test cases. I can't reproduce the problem, however solve_VPSC code in inkscape was getting quite out of date with that in www.sf.net/projects/adaptagrams. I've updated the code, which may fix the problem, or at least if it's reported again then I'll know it's still an issue. (bzr r803) --- src/removeoverlap/remove_rectangle_overlap.cpp | 45 ++++++++++++++------------ 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'src/removeoverlap/remove_rectangle_overlap.cpp') diff --git a/src/removeoverlap/remove_rectangle_overlap.cpp b/src/removeoverlap/remove_rectangle_overlap.cpp index 9f98d5811..6f6ace03a 100755 --- a/src/removeoverlap/remove_rectangle_overlap.cpp +++ b/src/removeoverlap/remove_rectangle_overlap.cpp @@ -1,3 +1,14 @@ +/** + * \brief remove overlaps between a set of rectangles. + * + * Authors: + * Tim Dwyer + * + * Copyright (C) 2005 Authors + * + * Released under GNU LGPL. Read the file 'COPYING' for more information. + */ + #include #include #include "generate-constraints.h" @@ -28,24 +39,23 @@ double Rectangle::yBorder=0; * 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) { +void removeRectangleOverlap(unsigned n, Rectangle *rs[], 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]; + Variable **vs=new Variable*[n]; for(int i=0;idesiredPosition; } - VPSC vpsc_x(vs,n,cs,m); + VPSC vpsc_x(n,vs,m,cs); #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]; } @@ -64,8 +72,8 @@ void removeRectangleOverlap(Rectangle *rs[], int n, double xBorder, double yBord // 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); + m=generateYConstraints(n,rs,vs,cs); + VPSC vpsc_y(n,vs,m,cs); #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); + m=generateXConstraints(n,rs,vs,cs,false); + VPSC vpsc_x2(n,vs,m,cs); #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) { + } catch (char const *str) { std::cerr<