给定两个矩形,判断这两个矩形是否重叠。
注意,一个矩形可以用两个坐标表示,左上角和右下角。所以我们主要给出以下四个坐标。
l1 :第一个矩形的左上角坐标。
r1 :第一个矩形的右下角坐标。
l2 :第二个矩形的左上角坐标。
r2 :第二个矩形的右下角坐标。
我们需要编写一个函数bool doOverlap(l1, r1, l2, r2),如果两个给定的矩形重叠,则返回 true。
注意:可以假设矩形与坐标轴平行。
一种解决方案是逐个选取一个矩形的所有点,然后查看该点是否位于另一个矩形内。这可以使用以下文章讨论的算法来完成。
JavaScript 如何检查给定点是位于多边形内还是外:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/145142710
C# 如何检查给定点是位于多边形内还是外:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/145142687
python 如何检查给定点是位于多边形内还是外:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/145142662
java 如何检查给定点是位于多边形内还是外:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/145142632
C++ 如何检查给定点是位于多边形内还是外:https://blog.youkuaiyun.com/hefeng_aspnet/article/details/145142452
以下是一种更简单的方法。如果以下条件之一为真,则两个矩形不重叠。
1 ) 一个矩形位于另一个矩形的上边缘上方。
2 ) 一个矩形位于另一个矩形左边缘的左侧。我们需要检查上述情况以确定给定的矩形是否重叠。
以下是上述方法的实现:
// CPP program for the above approach
#include <bits/stdc++.h>
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)
{
if (l1.x > r2.x || l2.x > r1.x)
return false;
// If one rectangle is above the other
if (r1.y > l2.y || r2.y > l1.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;
}
输出:
Rectangles Overlap
由于代码没有任何循环或递归,因此上述代码的时间复杂度为 O(1)
辅助空间: O(1)