Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local M = {}
- --
- function M.aabb(x1, y1, w1, h1, x2, y2, w2, h2)
- return not ((x2 > x1 + w1) or (x2 + w2 < x1) or
- (y2 > y1 + h1) or (y2 + h2 < y1))
- end
- function M.aabbPoint(x1, y1, x2, y2, w2, h2)
- return ((x1 > x2) and (x1 < x2 + w2) and
- (y1 > y2) and (y1 < y2 + h2))
- end
- function M.intersect(x1, y1, w1, h1, x2, y2, w2, h2)
- local mx1 = x1
- local my1 = y1
- local Mx1 = x1 + w1
- local My1 = y1 + h1
- if mx1 > Mx1 then
- mx1, Mx1 = Mx1, mx1
- end
- if my1 > My1 then
- mx1, Mx1 = Mx1, mx1
- end
- local mx2 = x2
- local my2 = y2
- local Mx2 = x2 + w2
- local My2 = y2 + h2
- if mx2 > Mx2 then
- mx2, Mx2 = Mx2, mx2
- end
- if my2 > My2 then
- mx2, Mx2 = Mx2, mx2
- end
- local rx = math.max(mx1, mx2)
- local ry = math.max(my1, my2)
- local rw = math.min(Mx1, Mx2)
- local rh = math.min(My1, My2)
- rw = rw - rx
- rh = rh - ry
- return rw > 0 and rh > 0, rx, ry, rw, rh
- end
- function M.collide(x1, y1, w1, h1, x2, y2, w2, h2)
- if not M.aabb(x1, y1, w1, h1, x2, y2, w2, h2) then
- return false, 0, 0
- end
- local vx = x1 + w1 * .5 - x2 - w2 * .5
- local vy = y1 + h1 * .5 - y2 - h2 * .5
- vx = vx > 0 and x2 + w2 - x1 or x2 - x1 - w1
- vy = vy > 0 and y2 + h2 - y1 or y2 - y1 - h1
- local xAxis = math.abs(vx) < math.abs(vy)
- return true, xAxis and vx or 0, xAxis and 0 or vy
- end
- return M
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement