首先规定 矩形Rect:
-- x1 最左部 x2 最右部 y1 最底部 y2 最顶部
Rect = {
x1 = 0,
x2 = 0,
y1 = 0,
y2 = 0,
}
解决思路1:
正向求解,考虑所有重叠的情况。
可以看出情况(1)、(2)、(3)可以转换为线段相交的问题,最后再对情况(4)做处理即可。
代码:
-- 两线段相交 判断情况(1)(2)(3)
local function CrossLine(left, right, y, bottom, top, x)
-- body
-- 判断一根横线和一根竖线是否交叉
-- 横线参数:left, right和y
-- 竖线参数:top, bottom和x
return left <= x and right >= x and bottom <= y and top >= y
end
local function CrossCon(r1, r2)
-- body
-- 从一个矩形中取出一条横线,与另一矩形中的两条竖线分别判断是否交叉
return CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x1)
or CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x2)
or CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x1)
or CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x2)
or CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x1)
or CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x2)
or CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x1)
or CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x2)
end
-- 包含情况 即情况(4)
local function ContainRect(r1, r2)
-- body
return r1.y2 > r2.y2 and r1.y1 < r2.y1 and r1.x2 > r2.x2 and r1.x1 < r2.x1
end
local function ContainCon(r1, r2)
-- body
return ContainRect(r1, r2)
or ContainRect(r2, r1)
end
-- 是否碰撞
local function IsCollision(r1, r2)
-- body
return ContainCon(r1, r2) or CrossCon(r1, r2)
end
local r1 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r2 = {x1 = 3, x2 = 7, y1 = 4, y2 = 9,}
print(IsCollision(r1, r2))
local r3 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r4 = {x1 = 6, x2 = 8, y1 = 1, y2 = 4,}
print(IsCollision(r3, r4))
local r5 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r6 = {x1 = 1, x2 = 3, y1 = 1, y2 = 4,}
print(IsCollision(r5, r6))
print("=====================我是分界线==============================")
结果:
true
false
true
=====================我是分界线==============================
解决思路2:
反向求解,对不相交的情况结果取反。
代码:
local function UnCollision(r1, r2)
-- body
return not (r1.x1 > r2.x2
or r1.y1 > r2.y2
or r2.x1 > r1.x2
or r2.y1 > r1.y2)
end
local r1 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r2 = {x1 = 3, x2 = 7, y1 = 4, y2 = 9,}
local r3 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r4 = {x1 = 6, x2 = 8, y1 = 1, y2 = 4,}
local r5 = {x1 = 0, x2 = 5, y1 = 0, y2 = 6,}
local r6 = {x1 = 1, x2 = 3, y1 = 1, y2 = 4,}
print(UnCollision(r1, r2))
print(UnCollision(r3, r4))
print(UnCollision(r5, r6))
print("=====================我是分界线==============================")
结果:
true
false
true
=====================我是分界线==============================