Oxygine  1
2g game engine
Rect.h
1 #pragma once
2 #include "oxygine-include.h"
3 #include "Vector2.h"
4 #include <algorithm>
5 #include <limits>
6 
7 namespace oxygine
8 {
9  template<typename point2>
10  class RectT
11  {
12  public:
13  typedef typename point2::type T;
14  typedef point2 type;
15 
16  RectT(): pos(0, 0), size(0, 0) {}
17  RectT(const point2& Pos, const point2& Size): pos(Pos), size(Size) {}
18  RectT(T x, T y, T w, T h): pos(x, y), size(w, h) {}
19 
20  static const RectT invalidated()
21  {
22  return RectT(
23  std::numeric_limits<T>::max() / 2,
24  std::numeric_limits<T>::max() / 2,
25  -std::numeric_limits<T>::max(),
26  -std::numeric_limits<T>::max());
27  }
28 
29  static const RectT huge()
30  {
31  return RectT(
32  -std::numeric_limits<T>::max() / 2,
33  -std::numeric_limits<T>::max() / 2,
34  std::numeric_limits<T>::max(),
35  std::numeric_limits<T>::max());
36  }
37 
38  bool operator == (const RectT& r) const
39  {
40  return r.pos == pos && r.size == size;
41  }
42 
43  bool operator != (const RectT& r) const
44  {
45  return !(*this == r);
46  }
47 
48  bool isEmpty()const
49  {
50  if (size.x <= 0 || size.y <= 0)
51  return true;
52  return false;
53  }
54 
55  bool isIntersecting(const RectT& r) const
56  {
57  RectT l = *this;
58  l.clip(r);
59  return !l.isEmpty();
60  }
61 
62  bool pointIn(const point2& p) const
63  {
64  point2 rb;
65  rb = pos + size;
66  return (p.x >= pos.x) && (p.x < rb.x) && (p.y >= pos.y) && (p.y < rb.y);
67  }
68 
69  void clip(const RectT& rect)
70  {
71  point2 pt = pos + size;
72 
73  if (pos.x < rect.pos.x)
74  pos.x = rect.pos.x;
75  if (pos.y < rect.pos.y)
76  pos.y = rect.pos.y;
77 
78  point2 rb = rect.pos + rect.size;
79 
80  if (pt.x > rb.x)
81  pt.x = rb.x;
82  if (pt.y > rb.y)
83  pt.y = rb.y;
84 
85  size.x = pt.x - pos.x;
86  size.y = pt.y - pos.y;
87  }
88 
89  void unite(const RectT& rect)
90  {
91  point2 rbA = pos + size;
92  point2 rbB = rect.pos + rect.size;
93 
94  pos.x = std::min(rect.pos.x, pos.x);
95  pos.y = std::min(rect.pos.y, pos.y);
96 
97  size.x = std::max(rbA.x, rbB.x) - pos.x;
98  size.y = std::max(rbA.y, rbB.y) - pos.y;
99  }
100 
101  void unite(const point2& p)
102  {
103  RectT r(p, point2(0, 0));
104  unite(r);
105  }
106 
107  point2 getCenter() const {return pos + size / 2;}
108  point2 getSize() const {return size;}
109  point2 getLeftTop() const {return pos;}
110  point2 getRightBottom() const {return pos + size;}
111  point2 getRightTop() const {return point2(getRight(), getTop());}
112  point2 getLeftBottom() const {return point2(getLeft(), getBottom());}
113 
114  T getX() const {return pos.x;}
115  T getY() const {return pos.y;}
116  T getLeft() const {return pos.x;}
117  T getTop() const {return pos.y;}
118  T getWidth() const {return size.x;}
119  T getHeight() const {return size.y;}
120 
121  T getRight() const {return pos.x + size.x;}
122  T getBottom() const {return pos.y + size.y;}
123 
124  void set(T x, T y, T w, T h) {pos.x = x; pos.y = y; size.x = w; size.y = h;}
125  void setPosition(const point2& pos_) {pos = pos_;}
126  void setPosition(T x, T y) {pos.x = x; pos.y = y;}
127  void setSize(const point2& size_) {size = size_;}
128  void setSize(T x, T y) {size.x = x; size.y = y;}
129  void setX(T v) {pos.x = v;}
130  void setY(T v) {pos.y = v;}
131 
132 
133  void setWidth(T v) {size.x = v;}
134  void setHeight(T v) {size.y = v;}
135 
136  void moveLeft(T v) {T p = pos.x; pos.x = v; size.x += p - v;}
137  void moveTop(T v) {T p = pos.y; pos.y = v; size.y += p - v;}
138  void moveRight(T v) {size.x = v - pos.x;}
139  void moveBottom(T v) {size.y = v - pos.y;}
140 
141  void expand(const point2& v1, const point2& v2) {pos -= v1; size += v1 + v2;}
142 
143  template<class R>
144  RectT operator * (const VectorT2<R>& v) const
145  {
146  RectT r(*this);
147  r.pos.x *= v.x;
148  r.pos.y *= v.y;
149  r.size.x *= v.x;
150  r.size.y *= v.y;
151  return r;
152  }
153 
154  template<class R>
155  RectT operator / (const VectorT2<R>& v) const
156  {
157  RectT r(*this);
158  r.pos.x /= v.x;
159  r.pos.y /= v.y;
160  r.size.x /= v.x;
161  r.size.y /= v.y;
162  return r;
163  }
164 
165  template<class R>
166  RectT operator * (const R& v) const
167  {
168  RectT r(*this);
169  r.pos.x *= v;
170  r.pos.y *= v;
171  r.size.x *= v;
172  r.size.y *= v;
173  return r;
174  }
175 
176  template<class R>
177  RectT operator / (const R& v) const
178  {
179  RectT r(*this);
180  r.pos.x /= v;
181  r.pos.y /= v;
182  r.size.x /= v;
183  r.size.y /= v;
184  return r;
185  }
186 
187 
188  template<typename R>
189  R cast() const
190  {
191  typedef R rect;
192  typedef typename R::type rect2type;
193  return rect(pos.template cast<rect2type>(), size.template cast<rect2type>());
194  }
195  /*
196  template<class R>
197  R cast() const
198  {
199  R r = R(pos.cast<R::type>(), size.cast<R::type>());
200  return r;
201  }
202  */
203 
204 
205  point2 pos;
206  point2 size;
207  };
208 
209  typedef RectT<Point> Rect;
210  typedef RectT<Vector2> RectF;
211 }
Definition: Rect.h:10
–oxgl-end–!
Definition: Actor.h:14
Definition: Vector2.h:9