836.矩形重叠

146 阅读1分钟

题目:
矩形以列表 [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
}