无法确定两个 squares/rectangles 是否相交
Can't determine if two squares/rectangles are intersecting each other
作为在线图形,我使用了:https://www.khanacademy.org/computer-programming/spin-off-of-rectx-y-width-height-radius/4975791745220608
矩形坐标:
矩形 1: x: 180 y: 30
矩形 2: x: 160 y: 30
我注意到渲染从一个点开始,然后在 X 轴上按宽度增加,在 Y 轴上按高度增加。所以我推断出以下内容:x1 和 y1 等于矩形坐标(x1 和 y1 是左上角)并且 x2,y2 是右下角 corner/coordinates 等于平方坐标之和或其他单词 x1 和 y1 以及正方形的宽度和高度。
这是我编写的代码:
#include <stdio.h>
#include <iostream>
struct A
{
int x1, x2;
int y1, y2;
};
struct B
{
int x1, x2;
int y1, y2;
};
bool doOverlap(A a, B b)
{
if (a.x1 < b.x2 && a.x2 > b.x1 &&
a.y1 > b.y2 && a.y2 < b.y1)
return true;
return false;
}
int main()
{
/*
Rectangle 1 coords: X: 180 Y: 30
Rectangle 2 coords: X: 160 Y: 30
*/
A a;
B b;
/*
The render begins from top left corner (that's our center and
from here begins the render with +width on x and +heigth on y
(correct me in case i'm wrong but that's what i noticed: https://imgur.com/a/nZKBB0m
(as can you see in that photo, the white rectangle has l1: (x,y): 0 0)
rectangles are 40x40
*/
a.x1 = 180;
a.y1 = 30;
a.x2 = a.x1 + 40;
a.y2 = a.y1 + 40;
b.x1 = 160;
b.y1 = 30;
b.x2 = b.x1 + 40;
b.y2 = b.y1 + 40;
if (doOverlap(a, b))
{
std::cout << "y";
}
else
std::cout << "n";
return 0;
}
问题是它总是 return 错误(检查了很多代码,但似乎没有一个有效)
那么,我做错了什么?
你只检查a是否在b之上,然后检查a是否在b的左边。
需要检查a和b的x区间是否重叠,再检查y区间是否重叠。这是一种方法:
bool doOverlap(A a, B b)
{
if (a.x1 > b.x2 || b.x1 > a.x2)
return false;
if (a.y1 > b.y2 || b.y1 > a.y2)
return false;
return true;
}
第一个 if 检查 a 和 b 的 x 间隔是否重叠,returns 如果不重叠则返回 false。第二个对 y 间隔执行相同的操作。如果 x 和 y 间隔重叠,则矩形重叠
作为在线图形,我使用了:https://www.khanacademy.org/computer-programming/spin-off-of-rectx-y-width-height-radius/4975791745220608
矩形坐标:
矩形 1: x: 180 y: 30
矩形 2: x: 160 y: 30
我注意到渲染从一个点开始,然后在 X 轴上按宽度增加,在 Y 轴上按高度增加。所以我推断出以下内容:x1 和 y1 等于矩形坐标(x1 和 y1 是左上角)并且 x2,y2 是右下角 corner/coordinates 等于平方坐标之和或其他单词 x1 和 y1 以及正方形的宽度和高度。
这是我编写的代码:
#include <stdio.h>
#include <iostream>
struct A
{
int x1, x2;
int y1, y2;
};
struct B
{
int x1, x2;
int y1, y2;
};
bool doOverlap(A a, B b)
{
if (a.x1 < b.x2 && a.x2 > b.x1 &&
a.y1 > b.y2 && a.y2 < b.y1)
return true;
return false;
}
int main()
{
/*
Rectangle 1 coords: X: 180 Y: 30
Rectangle 2 coords: X: 160 Y: 30
*/
A a;
B b;
/*
The render begins from top left corner (that's our center and
from here begins the render with +width on x and +heigth on y
(correct me in case i'm wrong but that's what i noticed: https://imgur.com/a/nZKBB0m
(as can you see in that photo, the white rectangle has l1: (x,y): 0 0)
rectangles are 40x40
*/
a.x1 = 180;
a.y1 = 30;
a.x2 = a.x1 + 40;
a.y2 = a.y1 + 40;
b.x1 = 160;
b.y1 = 30;
b.x2 = b.x1 + 40;
b.y2 = b.y1 + 40;
if (doOverlap(a, b))
{
std::cout << "y";
}
else
std::cout << "n";
return 0;
}
问题是它总是 return 错误(检查了很多代码,但似乎没有一个有效) 那么,我做错了什么?
你只检查a是否在b之上,然后检查a是否在b的左边。 需要检查a和b的x区间是否重叠,再检查y区间是否重叠。这是一种方法:
bool doOverlap(A a, B b)
{
if (a.x1 > b.x2 || b.x1 > a.x2)
return false;
if (a.y1 > b.y2 || b.y1 > a.y2)
return false;
return true;
}
第一个 if 检查 a 和 b 的 x 间隔是否重叠,returns 如果不重叠则返回 false。第二个对 y 间隔执行相同的操作。如果 x 和 y 间隔重叠,则矩形重叠