题目:
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。
如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形 rec1 和 rec2 。如果它们重叠,返回 true;否则,返回 false 。
算法:
方法一:模拟法
小心漏掉矩形四个角不在另一个矩形内部,而是中心点在另一个矩形内部的情况
func isRectangleOverlap(rec1 []int, rec2 []int) bool {
angles1 := getAngles(rec1)
angles2 := getAngles(rec2)
return anglesInRec(rec1, angles2) || anglesInRec(rec2, angles1)
}
func getAngles(rec []int) [][]int{
// 矩形四个顶点或者中点在另一个矩形内部
return [][]int{
[]int{rec[0], rec[1]},
[]int{rec[2], rec[3]},
[]int{rec[0], rec[3]},
[]int{rec[2], rec[1]},
[]int{(rec[0] + rec[2]) / 2, (rec[1] + rec[3]) / 2},
}
}
// rec [xMin, yMin, xMax, yMax] angles 矩形的四个角
func anglesInRec(rec []int, angles [][]int ) bool {
for i := range angles {
if rec[0] < angles[i][0] && angles[i][0] < rec[2] && rec[1] < angles[i][1] && angles[i][1] < rec[3] {
return true
}
}
return false
}