Code

update
[inkscape.git] / src / removeoverlap / remove_rectangle_overlap.cpp
index 30dbbaf9eda76e775062a718e3856fc2a53f46df..9fbef647b9c0d6fdbc73af453df284620f0a3222 100755 (executable)
@@ -1,3 +1,14 @@
+/**
+ * \brief remove overlaps between a set of rectangles.
+ *
+ * Authors:
+ *   Tim Dwyer <tgdwyer@gmail.com>
+ *
+ * Copyright (C) 2005 Authors
+ *
+ * Released under GNU LGPL.  Read the file 'COPYING' for more information.
+ */
+
 #include <iostream>
 #include <cassert>
 #include "generate-constraints.h"
@@ -5,6 +16,8 @@
 #include "variable.h"
 #include "constraint.h"
 #ifdef RECTANGLE_OVERLAP_LOGGING
+#include <fstream>
+#include "blocks.h"
 using std::ios;
 using std::ofstream;
 using std::endl;
@@ -26,35 +39,31 @@ 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) {
-       assert(0 <= n);
+void removeRectangleOverlap(unsigned n, Rectangle *rs[], double xBorder, double yBorder) {
        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;i<n;i++) {
-               ws[i]=1;
+       Variable **vs=new Variable*[n];
+       for(unsigned int i=0;i<n;i++) {
+               vs[i]=new Variable(i,0,1);
        }
-       Variable **vs;
        Constraint **cs;
        double *oldX = new double[n];
-       int m=generateXConstraints(rs,ws,n,vs,cs,true);
-       for(int i=0;i<n;i++) {
+       int m=generateXConstraints(n,rs,vs,cs,true);
+       for(unsigned int i=0;i<n;i++) {
                oldX[i]=vs[i]->desiredPosition;
        }
-       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"<<endl;
        f.close();
 #endif
        vpsc_x.solve();
-       for(int i=0;i<n;i++) {
+       for(unsigned int i=0;i<n;i++) {
                rs[i]->moveCentreX(vs[i]->position());
-               delete vs[i];
        }
-       delete [] vs;
        for(int i = 0; i < m; ++i) {
                delete cs[i];
        }
@@ -62,47 +71,44 @@ 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"<<endl;
        f.close();
 #endif
        vpsc_y.solve();
-       for(int i=0;i<n;i++) {
+       for(unsigned int i=0;i<n;i++) {
                rs[i]->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"<<endl;
        f.close();
 #endif
        vpsc_x2.solve();
-       for(int i=0;i<n;i++) {
-               rs[i]->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) {
+       for(unsigned int i=0;i<n;i++) {
+               rs[i]->moveCentreX(vs[i]->position());
+               delete vs[i];
+       }
+       delete [] vs;
+       } catch (char const *str) {
                std::cerr<<str<<std::endl;
-               for(int i=0;i<n;i++) {
+               for(unsigned int i=0;i<n;i++) {
                        std::cerr << *rs[i]<<std::endl;
                }
        }