Two Rectangles Overlap Detection Algorithm in C++
- 时间:2020-09-17 14:37:27
- 分类:网络文摘
- 阅读:137 次
A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bottom-left corner, and (x2, y2) are the coordinates of its top-right corner. Two rectangles overlap if the area of their intersection is positive. To be clear, two rectangles that only touch at the corner or edges do not overlap.
Given two (axis-aligned) rectangles, return whether they overlap.
Example 1:
Input: rec1 = [0,0,2,2], rec2 = [1,1,3,3]
Output: trueExample 2:
Input: rec1 = [0,0,1,1], rec2 = [1,0,2,1]
Output: falseNotes:
Both rectangles rec1 and rec2 are lists of 4 integers.
All coordinates in rectangles will be between -10^9 and 10^9.
The simple algorithm to determine whether two rectangles overlap is to exclude the situations that they do not overlap: if both rectangles are named as A and B. Then the below are four situations that A and B do not overlap.
- A is on the north of B.
- A is on the east of B.
- A is on the south of B.
- A is on the west of B.
These four situations can be checked by comparing just one coordinate either X or Y. Translating to C++ code, we have the following.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public: bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) { int lowerleft0[2] = {rec1[0], rec1[1]}; int lowerleft1[2] = {rec2[0], rec2[1]}; int topright0[2] = {rec1[2], rec1[3]}; int topright1[2] = {rec2[2], rec2[3]}; // exclude the situations when two rectangles are not overlapping return (! ((topright1[0] <= lowerleft0[0]) || (lowerleft1[0] >= topright0[0]) || (topright1[1] <= lowerleft0[1]) || (lowerleft1[1] >= topright0[1]))); } }; </int> |
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
int lowerleft0[2] = {rec1[0], rec1[1]};
int lowerleft1[2] = {rec2[0], rec2[1]};
int topright0[2] = {rec1[2], rec1[3]};
int topright1[2] = {rec2[2], rec2[3]};
// exclude the situations when two rectangles are not overlapping
return (!
((topright1[0] <= lowerleft0[0]) ||
(lowerleft1[0] >= topright0[0]) ||
(topright1[1] <= lowerleft0[1]) ||
(lowerleft1[1] >= topright0[1])));
}
};
</int>See the Delphi/Pascal Implementation of this rectangle overlapping algorithm in here: Rectangle Intersection Test. The complexity is O(1) constant and so is the space complexity.
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:数学题:如何只用这2个水壶从池塘里取得3升的水 关于可能性的数学题 数学题:ABCD乘9等于DCBA,问ABCD各是数字几 数学题:乘积末尾有几个0 求解答:加工一批服装,每天加工300套,16天可以完成 数学题-这个工厂原有男工人多少名 开心“六一”之太阳岛之旅作文 橘子洲作文 关于奢侈 爱你在心口难开(24至25章) 吴志俨
- 评论列表
-
- 添加评论