-- based of of plan9's Rectangle struct -- rect.max is not counted as "in" the rectangle Rect = {} Rect.__index = Rect function Rect:fromPoints(pt1, pt2) local o = { min = pt1, max = pt2 } setmetatable(o, self) return o end function Rect:getPoints() return self.min, self.max end function Rect:fromCoords(x1, y1, x2, y2) return Rect:fromPoints(Point:new(x1, y1), Point:new(x2, y2)) end function Rect:getCoords() return self.min.x, self.min.y, self.max.x, self.max.y end -- clone refers to a deep copy function Rect:clone() return Rect:fromCoords(self.min.x, self.min.y, self.max.x, self.max.y) end -- make sure min and max refer to the correct corners -- acts in place, returns self function Rect:fix() if self.min.x > self.max.x then self.min.x, self.max.x = self.max.x, self.min.x end if self.min.y > self.max.y then self.min.y, self.max.y = self.max.y, self.min.y end end function Rect:width() return self.max.x - self.min.x end function Rect:height() return self.max.y - self.min.y end function Rect:size() return Point:new(self:width(), self:height()) end function Rect:__add(pt) return Rect:fromPoints(self.min + pt, self.max + pt) end function Rect:corners() return { self.min:copy(), -- top left Point:new(self.max.x, self.min.y), -- top right Point:new(self.min.x, self.max.y), -- bottom left self.max:copy(), -- bottom right } end function Rect:containsPoint(pt) return pt.x >= self.min.x and pt.y >= self.min.y and pt.x <= self.max.x and pt.y <= self.max.y end function Rect:overlapsRect(other) return self.min.x < other.max.x and self.max.x > other.min.x and self.min.y < other.max.y and self.max.y > other.min.y end function Rect:draw(style) love.graphics.rectangle(style, self.min.x - Camera.pos.x, self.min.y - Camera.pos.y, self:width(), self:height()) end function Rect:__tostring() return "Rect["..tostring(self.min).." "..tostring(self.max).."]" end