79e422af03eaa411688ebf29d07c0a35287f5c86
[supertux.git] / src / math / rect.hpp
1 //  $Id$
2 //
3 //  SuperTux
4 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20 #ifndef __RECT_H__
21 #define __RECT_H__
22
23 #include <assert.h>
24 #include "vector.hpp"
25
26 /** This class represents a rectangle.
27  * (Implementation Note) We're using upper left and lower right point instead of
28  * upper left and width/height here, because that makes the collision dectection
29  * a little bit efficienter.
30  */
31 class Rect
32 {
33 public:
34   Rect()
35   { }
36
37   Rect(const Vector& np1, const Vector& np2)
38     : p1(np1), p2(np2)
39   {
40   }
41
42   Rect(float x1, float y1, float x2, float y2)
43     : p1(x1, y1), p2(x2, y2)
44   {
45     assert(p1.x <= p2.x && p1.y <= p2.y);
46   }
47
48   float get_left() const
49   { return p1.x; }
50
51   float get_right() const
52   { return p2.x; }
53
54   float get_top() const
55   { return p1.y; }
56
57   float get_bottom() const
58   { return p2.y; }
59
60   float get_width() const
61   { return p2.x - p1.x; }
62
63   float get_height() const
64   { return p2.y - p1.y; }
65
66   Vector get_middle() const
67   { return Vector((p1.x+p2.x)/2, (p1.y+p2.y)/2); }
68
69   void set_pos(const Vector& v)
70   {
71     move(v-p1);
72   }
73
74   void set_height(float height)
75   {
76     p2.y = p1.y + height;
77   }
78   void set_width(float width)
79   {
80     p2.x = p1.x + width;
81   }
82   void set_size(float width, float height)
83   {
84     set_width(width);
85     set_height(height);
86   }    
87   Vector get_size()
88   {
89     return Vector(get_width(), get_height());
90   }
91
92   void move(const Vector& v)
93   {
94     p1 += v;
95     p2 += v;
96   }
97
98   bool contains(const Vector& v) const
99   {
100     return v.x >= p1.x && v.y >= p1.y && v.x < p2.x && v.y < p2.y;
101   }
102   bool contains(const Rect& other) const
103   {
104     if(p1.x >= other.p2.x || other.p1.x >= p2.x)
105       return false;
106     if(p1.y >= other.p2.y || other.p1.y >= p2.y)
107       return false;
108
109     return true;
110   }
111    
112   // leave these 2 public to safe the headaches of set/get functions for such
113   // simple things :)
114
115   /// upper left edge
116   Vector p1;
117   /// lower right edge
118   Vector p2;
119 };
120
121 #endif
122