📌  相关文章
📜  查找两个矩形是否重叠

📅  最后修改于: 2021-04-29 09:34:17             🧑  作者: Mango

给定两个矩形,请查找给定的两个矩形是否重叠。
注意,矩形可以由两个坐标表示,即左上角和右下角。所以主要是给我们以下四个坐标。
l1 :第一个矩形的左上坐标。
r1 :第一个矩形的右下角坐标。
l2 :第二个矩形的左上坐标。
r2 :第二个矩形的右下角坐标。

矩形重叠

我们需要编写一个函数bool doOverlap(l1,r1,l2,r2) ,如果两个给定的矩形重叠,则返回true。

注意:可以假定矩形与坐标轴平行。
一种解决方案是一个接一个地选择一个矩形的所有点,然后查看该点是否位于另一个矩形内。可以使用此处讨论的算法来完成。
以下是一种更简单的方法。如果满足以下条件之一,则两个矩形重叠。
1)一个矩形位于另一个矩形的上边缘上方。
2)一个矩形位于另一矩形的左边缘的左侧。
我们需要检查上述情况,以确定给定的矩形是否重叠。以下是上述方法的实现。

C++
// CPP program for the above approach
#include 
 
struct Point {
    int x, y;
};
 
// Returns true if two rectangles (l1, r1) and (l2, r2)
// overlap
bool doOverlap(Point l1, Point r1, Point l2, Point r2)
{
 
    // To check if either rectangle is actually a line
    // For example :  l1 ={-1,0}  r1={1,1}  l2={0,-1}
    // r2={0,1}
 
    if (l1.x == r1.x || l1.y == r2.y || l2.x == r2.x
        || l2.y == r2.y) {
        // the line cannot have positive overlap
        return false;
    }
 
    // If one rectangle is on left side of other
    if (l1.x >= r2.x || l2.x >= r1.x)
        return false;
 
    // If one rectangle is above other
    if (l1.y <= r2.y || l2.y <= r1.y)
        return false;
 
    return true;
}
 
/* Driver program to test above function */
int main()
{
    Point l1 = { 0, 10 }, r1 = { 10, 0 };
    Point l2 = { 5, 5 }, r2 = { 15, 0 };
    if (doOverlap(l1, r1, l2, r2))
        printf("Rectangles Overlap");
    else
        printf("Rectangles Don't Overlap");
    return 0;
}


Java
// Java program to check if rectangles overlap  
class GFG {
 
   static class Point {
 
        int x, y;
    }
 
// Returns true if two rectangles (l1, r1) and (l2, r2) overlap
 static  boolean doOverlap(Point l1, Point r1, Point l2, Point r2) {
         
           // To check if either rectangle is actually a line
          // For example :  l1 ={-1,0}  r1={1,1}  l2={0,-1}  r2={0,1}
    
          if (l1.x == r1.x || l1.y == r2.y || l2.x == r2.x || l2.y == r2.y)
            {
                    // the line cannot have positive overlap
                return false;
            }
    
    
           // If one rectangle is on left side of other
        if (l1.x >= r2.x || l2.x >= r1.x) {
            return false;
        }
 
        // If one rectangle is above other
        if (l1.y <= r2.y || l2.y <= r1.y) {
            return false;
        }
 
        return true;
    }
 
    /* Driver program to test above function */
    public static void main(String[] args) {
        Point l1 = new Point(),r1 = new Point(),
                l2 = new Point(),r2 = new Point();
        l1.x=0;l1.y=10; r1.x=10;r1.y=0;
         l2.x=5;l2.y=5; r2.x=15;r2.y=0;
 
        if (doOverlap(l1, r1, l2, r2)) {
            System.out.println("Rectangles Overlap");
        } else {
            System.out.println("Rectangles Don't Overlap");
        }
    }
}
//this code contributed by PrinciRaj1992


Python3
# Python program to check if rectangles overlap
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
# Returns true if two rectangles(l1, r1)
# and (l2, r2) overlap
def doOverlap(l1, r1, l2, r2):
     
    # To check if either rectangle is actually a line
      # For example  :  l1 ={-1,0}  r1={1,1}  l2={0,-1}  r2={0,1}
       
    if (l1.x == r1.x or l1.y == r2.y or l2.x == r2.x or l2.y == r2.y):
        # the line cannot have positive overlap
        return False
       
     
    # If one rectangle is on left side of other
    if(l1.x >= r2.x or l2.x >= r1.x):
        return False
 
    # If one rectangle is above other
    if(l1.y <= r2.y or l2.y <= r1.y):
        return False
 
    return True
 
# Driver Code
if __name__ == "__main__":
    l1 = Point(0, 10)
    r1 = Point(10, 0)
    l2 = Point(5, 5)
    r2 = Point(15, 0)
 
    if(doOverlap(l1, r1, l2, r2)):
        print("Rectangles Overlap")
    else:
        print("Rectangles Don't Overlap")
 
# This code is contributed by Vivek Kumar Singh


C#
// C# program to check if rectangles overlap
using System;
     
class GFG
{
    class Point
    {
        public int x, y;
    }
 
    // Returns true if two rectangles (l1, r1)
    // and (l2, r2) overlap
    static bool doOverlap(Point l1, Point r1,
                          Point l2, Point r2)
    {
        // If one rectangle is on left side of other
        if (l1.x >= r2.x || l2.x >= r1.x)
        {
            return false;
        }
 
        // If one rectangle is above other
        if (l1.y <= r2.y || l2.y <= r1.y)
        {
            return false;
        }
        return true;
    }
 
    // Driver Code
    public static void Main()
    {
        Point l1 = new Point(), r1 = new Point(),
                l2 = new Point(), r2 = new Point();
        l1.x = 0;l1.y = 10; r1.x = 10;r1.y = 0;
        l2. = 5;l2.y = 5; r2.x = 15;r2.y = 0;
        if (doOverlap(l1, r1, l2, r2))
        {
            Console.WriteLine("Rectangles Overlap");
        } else
        {
            Console.WriteLine("Rectangles Don't Overlap");
        }
    }
}
 
// This code is contributed by
// Rajput-Ji


输出:

Rectangles Overlap

上述代码的时间复杂度为O(1),因为该代码没有任何循环或递归。