1 /**
2 * \brief Remove overlaps function
3 *
4 * Authors:
5 * Tim Dwyer <tgdwyer@gmail.com>
6 *
7 * Copyright (C) 2005 Authors
8 *
9 * Released under GNU GPL. Read the file 'COPYING' for more information.
10 */
12 #ifndef SEEN_REMOVEOVERLAP_GENERATE_CONSTRAINTS_H
13 #define SEEN_REMOVEOVERLAP_GENERATE_CONSTRAINTS_H
14 #include <iostream>
16 class Rectangle {
17 friend std::ostream& operator <<(std::ostream &os, const Rectangle &r);
18 public:
19 static double xBorder,yBorder;
20 Rectangle(double x, double X, double y, double Y);
21 double getMaxX() const { return maxX+xBorder; }
22 double getMaxY() const { return maxY+yBorder; }
23 double getMinX() const { return minX; }
24 double getMinY() const { return minY; }
25 double getMinD(unsigned const d) const {
26 return ( d == 0 ? getMinX() : getMinY() );
27 }
28 double getMaxD(unsigned const d) const {
29 return ( d == 0 ? getMaxX() : getMaxY() );
30 }
31 double getCentreX() const { return minX+width()/2.0; }
32 double getCentreY() const { return minY+height()/2.0; }
33 double width() const { return getMaxX()-minX; }
34 double height() const { return getMaxY()-minY; }
35 static void setXBorder(double x) {xBorder=x;}
36 static void setYBorder(double y) {yBorder=y;}
37 void moveCentreX(double x) {
38 moveMinX(x-width()/2.0);
39 }
40 void moveCentreY(double y) {
41 moveMinY(y-height()/2.0);
42 }
43 void moveMinX(double x) {
44 maxX=x+width()-xBorder;
45 minX=x;
46 }
47 void moveMinY(double y) {
48 maxY=y+height()-yBorder;
49 minY=y;
50 }
51 inline double overlapX(Rectangle *r) const {
52 if (getCentreX() <= r->getCentreX() && r->minX < getMaxX())
53 return getMaxX() - r->minX;
54 if (r->getCentreX() <= getCentreX() && minX < r->getMaxX())
55 return r->getMaxX() - minX;
56 return 0;
57 }
58 inline double overlapY(Rectangle *r) const {
59 if (getCentreY() <= r->getCentreY() && r->minY < getMaxY())
60 return getMaxY() - r->minY;
61 if (r->getCentreY() <= getCentreY() && minY < r->getMaxY())
62 return r->getMaxY() - minY;
63 return 0;
64 }
65 private:
66 double minX,maxX,minY,maxY;
67 };
70 class Variable;
71 class Constraint;
73 // returns number of constraints generated
74 int generateXConstraints(Rectangle *rs[], double weights[], const int n, Variable **&vs, Constraint **&cs,bool useNeighbourLists);
76 int generateYConstraints(Rectangle *rs[], double weights[], const int n, Variable **&vs, Constraint **&cs);
78 #endif // SEEN_REMOVEOVERLAP_GENERATE_CONSTRAINTS_H