重叠的矩形
Overlapping rectangles
大家好!所以,我有一个像 this one 这样的案例。
我需要写一个方法,说明矩形是否相互重叠。输入如下:高度、宽度、x-pos 和 y-pos 以及矩形平行于 x 和 y 轴。我使用了 questio 中的解决方案,我给了它 link,但它不能正常工作。它告诉矩形即使不重叠也重叠!我错过了什么重要的东西吗?
代码本身:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return (!(r1.Left > r2.Left + r2.Width) || !(r1.Left + r1.Width < r2.Left) || !(r1.Top < r2.Top - r2.Height)|| !(r1.Top - r1.Height > r2.Top));
}
非常感谢您的帮助!
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return !Rectangle.Intersect(r1, r2).IsEmpty;
}
如果不能使用Rectangle.Intersect
:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
int x1 = Math.Max(r1.X, r2.X);
int x2 = Math.Min(r1.X + r1.Width, r2.X + r2.Width);
int y1 = Math.Max(r1.Y, r2.Y);
int y2 = Math.Min(r1.Y + r1.Height, r2.Y + r2.Height);
return (x2 >= x1 && y2 >= y1);
}
另一种方法:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return(r2.X < r1.X + r1.Width) &&
(r1.X < (r2.X + r2.Width)) &&
(r2.Y < r1.Y + r1.Height) &&
(r1.Y < r2.Y + r2.Height);
}
答案在您链接的页面上。对代码的唯一更改是将 rx.Right
替换为 rx.Left + rx.Width
并将 rx.Bottom
替换为 rx.Top + rx.Height
.
return !(r1.Left > r2.Left + r2.Width) &&
!(r1.Left + r1.Width < r2.Left) &&
!(r1.Top > r2.Top + r2.Height) &&
!(r1.Top + r1.Height < r2.Top);
再一次,我假设您有自己的 Rectangle
class 您正在使用。如果您使用 .NET Rectangle struct,该对象具有内置的 Right
和 Bottom
属性,因此无需代码替换。
return !(r1.Left > r2.Right) &&
!(r1.Right < r2.Left) &&
!(r1.Top > r2.Bottom) &&
!(r1.Bottom < r2.Top);
当然,你也可以简单地使用静态Rectangle.Intersect方法。
return !Rectangle.Intersect(r1, r2).IsEmpty;
这两种方法是等效的 - 你混合了 ||和&&
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
bool test1 = ((r1.Left > r2.Left + r2.Width) || (r1.Left + r1.Width < r2.Left) || (r1.Top < r2.Top - r2.Height)|| (r1.Top - r1.Height > r2.Top));
bool test2 = (!(r1.Left > r2.Left + r2.Width) && !(r1.Left + r1.Width < r2.Left) && !(r1.Top < r2.Top - r2.Height) && !(r1.Top - r1.Height > r2.Top));
return test1; // or test2 as they are logically equivalent
}
大家好!所以,我有一个像 this one 这样的案例。 我需要写一个方法,说明矩形是否相互重叠。输入如下:高度、宽度、x-pos 和 y-pos 以及矩形平行于 x 和 y 轴。我使用了 questio 中的解决方案,我给了它 link,但它不能正常工作。它告诉矩形即使不重叠也重叠!我错过了什么重要的东西吗?
代码本身:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return (!(r1.Left > r2.Left + r2.Width) || !(r1.Left + r1.Width < r2.Left) || !(r1.Top < r2.Top - r2.Height)|| !(r1.Top - r1.Height > r2.Top));
}
非常感谢您的帮助!
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return !Rectangle.Intersect(r1, r2).IsEmpty;
}
如果不能使用Rectangle.Intersect
:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
int x1 = Math.Max(r1.X, r2.X);
int x2 = Math.Min(r1.X + r1.Width, r2.X + r2.Width);
int y1 = Math.Max(r1.Y, r2.Y);
int y2 = Math.Min(r1.Y + r1.Height, r2.Y + r2.Height);
return (x2 >= x1 && y2 >= y1);
}
另一种方法:
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
return(r2.X < r1.X + r1.Width) &&
(r1.X < (r2.X + r2.Width)) &&
(r2.Y < r1.Y + r1.Height) &&
(r1.Y < r2.Y + r2.Height);
}
答案在您链接的页面上。对代码的唯一更改是将 rx.Right
替换为 rx.Left + rx.Width
并将 rx.Bottom
替换为 rx.Top + rx.Height
.
return !(r1.Left > r2.Left + r2.Width) &&
!(r1.Left + r1.Width < r2.Left) &&
!(r1.Top > r2.Top + r2.Height) &&
!(r1.Top + r1.Height < r2.Top);
再一次,我假设您有自己的 Rectangle
class 您正在使用。如果您使用 .NET Rectangle struct,该对象具有内置的 Right
和 Bottom
属性,因此无需代码替换。
return !(r1.Left > r2.Right) &&
!(r1.Right < r2.Left) &&
!(r1.Top > r2.Bottom) &&
!(r1.Bottom < r2.Top);
当然,你也可以简单地使用静态Rectangle.Intersect方法。
return !Rectangle.Intersect(r1, r2).IsEmpty;
这两种方法是等效的 - 你混合了 ||和&&
public static bool AreIntersected(Rectangle r1, Rectangle r2)
{
bool test1 = ((r1.Left > r2.Left + r2.Width) || (r1.Left + r1.Width < r2.Left) || (r1.Top < r2.Top - r2.Height)|| (r1.Top - r1.Height > r2.Top));
bool test2 = (!(r1.Left > r2.Left + r2.Width) && !(r1.Left + r1.Width < r2.Left) && !(r1.Top < r2.Top - r2.Height) && !(r1.Top - r1.Height > r2.Top));
return test1; // or test2 as they are logically equivalent
}