]> Shamusworld >> Repos - architektonas/blobdiff - src/rect.cpp
Preliminary support for Polylines.
[architektonas] / src / rect.cpp
index 54f44ddf73abcb404c95d1b6d397674a90a16b8c..c38c0741e08d2d08b0568afbd4e4034c45151c97 100644 (file)
 // 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();
@@ -30,6 +31,10 @@ Rect::Rect(Point tl, Point br): l(tl.x), r(br.x), t(tl.y), b(br.y)
        Normalize();
 }
 
+Rect::Rect(Point p): l(p.x), r(p.x), t(p.y), b(p.y)
+{
+}
+
 Rect & Rect::operator*=(double scale)
 {
        l *= scale;
@@ -58,6 +63,45 @@ Rect & Rect::operator|=(Rect r2)
        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)
@@ -93,12 +137,12 @@ void Rect::Expand(double amt)
 
 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)
@@ -106,6 +150,11 @@ 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);