liuguanyu / quiz-every-meeting

8 stars 0 forks source link

2018-05-22 #7

Open liuguanyu opened 6 years ago

liuguanyu commented 6 years ago

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。

如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。

给出两个矩形,判断它们是否重叠并返回结果。

示例 1:

输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true

示例 2:

输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false

说明:

两个矩形 rec1 和 rec2 都以含有四个整数的列表的形式给出。 矩形中的所有坐标都处于 -10^9 和 10^9 之间。

wuxueguang commented 6 years ago
function isRectangleOverlap(rec1, rec2) {
    var flag0 = rec2[0] >= rec1[2];
    var flag1 = rec2[2] <= rec1[0];
    var flag2 = rec2[1] >= rec1[3];
    var flag3 = rec2[3] <= rec1[1];

    return !(flag0 || flag1 || flag2 || flag3);
}
liuguanyu commented 6 years ago
var isRectangleOverlap = function(rec1, rec2) {
    // 求边长的一半
    var halfX1 = Math.abs(rec1[2] - rec1[0])/2
    var halfY1 = Math.abs(rec1[3] - rec1[1])/2

    var halfX2 = Math.abs(rec2[2] - rec2[0])/2
    var halfY2 = Math.abs(rec2[3] - rec2[1])/2

    // 求各中心位置
    var midX1 = (rec1[0] + rec1[2])/2
    var midY1 = (rec1[1] + rec1[3])/2
    var midX2 = (rec2[0] + rec2[2])/2 
    var midY2 = (rec2[1] + rec2[3])/2 

    // 求中心xy距离 
    var dx = Math.abs(midX2 - midX1)
    var dy = Math.abs(midY2 - midY1)

    // 相交的条件:中心距离<边长一半之和
   return dx < halfX1+halfX2 && dy < halfY1+halfY2
};
Otobelikethee commented 6 years ago
function isRectangleOverlap(rec1, rec2) {
  var is_BottomLeftPoint_Legal = false, 
      is_TopRightPoint_Legal = false;

  // 左下角顶点在“合法象限”(以矩形上边为X轴,右边为Y轴的直角坐标系的第三象限)内
  var blp_deltaX = rec1[2] - rec2[0];
  var blp_deltaY = rec1[3] - rec2[1];

  if (blp_deltaX > 0 && blp_deltaY > 0) is_BottomLeftPoint_Legal = true;

  // 右上角顶点在“合法象限”(以矩形底边为X轴,左边为Y轴的直角坐标系的第一象限)内
  var trp_deltaX = rec2[2] - rec1[0];
  var trp_deltaY = rec2[3] - rec1[1];

  if (trp_deltaX > 0 && trp_deltaY > 0) is_TopRightPoint_Legal = true;

  return is_BottomLeftPoint_Legal && is_TopRightPoint_Legal;
}