// JLH 11/10/2016 Created this file
//
+
#include "rect.h"
-//#include <stdio.h>
+#include <math.h>
Rect::Rect(): l(0), r(0), t(0), b(0)
{
}
-Rect::Rect(double ll, double rr, double tt, double bb):
+Rect::Rect(double tt, double ll, double bb, double rr):
l(ll), r(rr), t(tt), b(bb)
{
Normalize();
Normalize();
}
+Rect::Rect(Point p): l(p.x), r(p.x), t(p.y), b(p.y)
+{
+}
+
Rect & Rect::operator*=(double scale)
{
l *= scale;
return *this;
}
+Rect & Rect::operator+=(Point p)
+{
+ if (p.x < l)
+ l = p.x;
+
+ if (p.x > r)
+ r = p.x;
+
+ if (p.y < b)
+ b = p.y;
+
+ if (p.y > t)
+ t = p.y;
+
+ return *this;
+}
+
+//
+// We use this to give a rect an array-like access, which allows access of the
+// rect in TLBR order (from 0 to 3). Also, values greater than 3 are treated
+// as mod 4.
+//
+double & Rect::operator[](int idx)
+{
+ idx = idx % 4;
+
+ switch (idx)
+ {
+ case 0:
+ return t;
+ case 1:
+ return l;
+ case 2:
+ return b;
+ }
+
+ return r;
+}
+
void Rect::Normalize(void)
{
if (l > r)
double Rect::Width(void)
{
- return r - l;
+ return fabs(r - l);
}
double Rect::Height(void)
{
- return t - b;
+ return fabs(t - b);
}
bool Rect::Contains(Point p)
return ((p.x >= l) && (p.x <= r) && (p.y >= b) && (p.y <= t) ? true : false);
}
+bool Rect::Contains(Rect rect)
+{
+ return ((rect.l >= l) && (rect.r <= r) && (rect.b >= b) && (rect.t <= t) ? true : false);
+}
+
Point Rect::TopLeft(void)
{
return Point(l, t);