aboutsummaryrefslogtreecommitdiff
path: root/src/RectangleUtil.hh
blob: dfb00825ebe3237d40ef89205f58189d0c43f2d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef RECTANGLEUTIL_HH
#define RECTANGLEUTIL_HH

namespace RectangleUtil {

inline bool insideRectangle(int x, int y, int width, int height, int px, int py) {

    return
        px >= x &&
        px < (x + width) &&
        py >= y &&
        py < (y + height);
}

/*
 * Determines if a point is inside a rectangle-like objects border.
 * @param rect A rectangle-like object that has accessors for x, y, width, and
 *        height.
 * @param x
 * @param y 
 * @param border The size of the border.
 * @returns true if point is inside the rectangle-like object.
*/

template <typename RectangleLike>
bool insideBorder(const RectangleLike& rect,
                  int x, int y,
                  int border) {
    const int w = static_cast<int>(rect.width()) - border;
    const int h = static_cast<int>(rect.height()) - border;
    return insideRectangle(rect.x() + border, rect.y() + border, w, h, x, y);
}



/*
 * Determines if rectangle 'a' overlaps rectangle 'b'
 * @returns true if 'a' overlaps 'b'
 *
 *    outside              overlap situations
 *
 *  a----a            a----a         a--------a  b--------b
 *  |    | b----b     |  b-+--b      | b----b |  | a----a |
 *  a----a |    |     a--+-a  |      | |    | |  | |    | |
 *         b----b        b----b      | b----b |  | a----a |
 *                                   a--------a  b--------b
 *
 */

inline bool overlapRectangles(
        int ax, int ay, int awidth, int aheight,
        int bx, int by, int bwidth, int bheight) {

    bool do_not_overlap =
         ax > (bx + bwidth)
      || bx > (ax + awidth)
      || ay > (by + bheight)
      || by > (ay + aheight);

    return !do_not_overlap;
}


/*
 * Determines if rectangle 'a' overlaps rectangle 'b'
 * @param a - rectangle a
 * @param b - rectangle b
 * @returns true if 'a' overlaps 'b'
 */
template <typename RectangleLikeA, typename RectangleLikeB>
bool overlapRectangles(const RectangleLikeA& a, const RectangleLikeB& b) {

    return overlapRectangles(
            a.x(), a.y(), a.width(), a.height(),
            b.x(), b.y(), b.width(), b.height());
}

} // namespace RectangleUtil


#endif // RECTANGLEUTIL_HH