| @@ -301,21 +301,28 @@ struct Rect { | |||||
| static Rect fromMinMax(Vec a, Vec b) { | static Rect fromMinMax(Vec a, Vec b) { | ||||
| return Rect(a, b.minus(a)); | return Rect(a, b.minus(a)); | ||||
| } | } | ||||
| static Rect inf() { | |||||
| return Rect(Vec(-INFINITY, -INFINITY), Vec(INFINITY, INFINITY)); | |||||
| } | |||||
| /** Returns whether this Rect contains an entire point, inclusive on the top/left, non-inclusive on the bottom/right. */ | |||||
| /** Returns whether this Rect contains an entire point, inclusive. */ | |||||
| bool contains(Vec v) const { | bool contains(Vec v) const { | ||||
| return pos.x <= v.x && v.x < pos.x + size.x | |||||
| && pos.y <= v.y && v.y < pos.y + size.y; | |||||
| // Handle the case where pos=-inf and size=inf | |||||
| // i.e. don't ever use `pos + size` which is NAN | |||||
| return (pos.x <= v.x) && (v.x - size.x <= pos.x) | |||||
| && (pos.y <= v.y) && (v.y - size.y <= pos.y); | |||||
| } | } | ||||
| /** Returns whether this Rect contains an entire Rect. */ | /** Returns whether this Rect contains an entire Rect. */ | ||||
| bool contains(Rect r) const { | bool contains(Rect r) const { | ||||
| return pos.x <= r.pos.x && r.pos.x + r.size.x <= pos.x + size.x | |||||
| && pos.y <= r.pos.y && r.pos.y + r.size.y <= pos.y + size.y; | |||||
| // Handle the case where pos=-inf and size=inf for either Rect | |||||
| return (pos.x <= r.pos.x) && (r.pos.x - size.x <= pos.x - r.size.x) | |||||
| && (pos.y <= r.pos.y) && (r.pos.y - size.y <= pos.y - r.size.y); | |||||
| } | } | ||||
| /** Returns whether this Rect overlaps with another Rect. */ | /** Returns whether this Rect overlaps with another Rect. */ | ||||
| bool intersects(Rect r) const { | bool intersects(Rect r) const { | ||||
| return (pos.x + size.x > r.pos.x && r.pos.x + r.size.x > pos.x) | |||||
| && (pos.y + size.y > r.pos.y && r.pos.y + r.size.y > pos.y); | |||||
| // Handle the case where pos=-inf and size=inf for either Rect | |||||
| return (r.pos.x - size.x <= pos.x) && (pos.x - r.size.x <= r.pos.x) | |||||
| && (r.pos.y - size.y <= pos.y) && (pos.y - r.size.y <= r.pos.y); | |||||
| } | } | ||||
| bool equals(Rect r) const { | bool equals(Rect r) const { | ||||
| return pos.equals(r.pos) && size.equals(r.size); | return pos.equals(r.pos) && size.equals(r.size); | ||||