2 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #ifndef HEADER_SUPERTUX_MATH_RECTF_HPP
18 #define HEADER_SUPERTUX_MATH_RECTF_HPP
22 #include "math/sizef.hpp"
23 #include "math/vector.hpp"
24 #include "object/anchor_point.hpp"
28 /** This class represents a rectangle.
29 * (Implementation Note) We're using upper left and lower right point instead of
30 * upper left and width/height here, because that makes the collision detection
31 * a little bit more efficient.
41 Rectf(const Vector& np1, const Vector& np2) :
46 Rectf(float x1, float y1, float x2, float y2) :
47 p1(x1, y1), p2(x2, y2)
49 assert(p1.x <= p2.x && p1.y <= p2.y);
52 Rectf(const Vector& p1_, const Sizef& size);
54 float get_left() const
57 float get_right() const
63 float get_bottom() const
66 float get_width() const
67 { return p2.x - p1.x; }
69 float get_height() const
70 { return p2.y - p1.y; }
72 Vector get_middle() const
73 { return Vector((p1.x+p2.x)/2, (p1.y+p2.y)/2); }
75 void set_pos(const Vector& v)
80 void set_height(float height)
84 void set_width(float width)
88 void set_size(float width, float height)
93 Sizef get_size() const
95 return Sizef(get_width(), get_height());
98 void move(const Vector& v)
104 bool contains(const Vector& v) const
106 return v.x >= p1.x && v.y >= p1.y && v.x < p2.x && v.y < p2.y;
108 bool contains(const Rectf& other) const
110 if(p1.x >= other.p2.x || other.p1.x >= p2.x)
112 if(p1.y >= other.p2.y || other.p1.y >= p2.y)
118 float distance (const Vector& other, AnchorPoint ap = ANCHOR_MIDDLE) const
120 Vector v = get_anchor_pos (*this, ap);
121 return ((v - other).norm ());
124 float distance (const Rectf& other, AnchorPoint ap = ANCHOR_MIDDLE) const
126 Vector v1 = get_anchor_pos (*this, ap);
127 Vector v2 = get_anchor_pos (other, ap);
129 return ((v1 - v2).norm ());
132 // leave these two public to save the headaches of set/get functions for such