负大小的矩形如何相交?

本文关键字:何相交 | 更新日期: 2023-09-27 17:53:47

有人能解释一下为什么负大小的Rectangle会这样相交吗?

var r  = new Rectangle(0, 0,  3,  3);
var r0 = new Rectangle(0, 0, -1, -1);
var r1 = new Rectangle(1, 1, -1, -1);
var r2 = new Rectangle(2, 2, -1, -1);
var r3 = new Rectangle(3, 3, -1, -1);
System.Console.WriteLine(r.IntersectsWith(r0)); // False
System.Console.WriteLine(r.IntersectsWith(r1)); // False
System.Console.WriteLine(r.IntersectsWith(r2)); // True
System.Console.WriteLine(r.IntersectsWith(r3)); // False

我认为r1r2应该总是与r相交,即使它们不相交。如果考虑到它们的负大小,r3应该相交。如果不考虑负尺寸,则r0应相交。

为什么这个工作方式是这样的,以及我在使用Rectangle结构时应该寻找的其他注意事项?

负大小的矩形如何相交?

如果您创建的矩形宽度为负,则它将从原始(x,y)点开始绘制矩形,并向左而不是向右绘制。

如果你创建了一个负高度的矩形,那么它将绘制一个从原始(x,y)点开始的矩形,并向上而不是向下绘制。

因此,如果你用new Rectangle(5, 4, -1, -2);做一个矩形,那么你会得到一个具有以下点的矩形:(5,4),(4,4),(5,2),(4,2)。

运行以下代码作为示例:

    Rectangle negWidthHeightRect = new Rectangle(5, 4, -1, -2);
    Console.WriteLine(negWidthHeightRect.Left);
    Console.WriteLine(negWidthHeightRect.Right);
    Console.WriteLine(negWidthHeightRect.Bottom);
    Console.WriteLine(negWidthHeightRect.Top);
    Console.WriteLine(negWidthHeightRect.Width);
    Console.WriteLine(negWidthHeightRect.Height);
    Console.ReadLine();

输出如下:

5
4
2
4
-1
-2

考虑到微软对其他类矩形控件(除了System.Drawing.Rectangle)的评论,该行为在某种程度上是预期的。

那么,为什么矩形的IntersectsWith方法会产生如此奇怪的结果呢?这是因为它使用以下代码来实现IntersectsWith方法:
public bool IntersectsWith(Rectangle rect)
{
    return ((((rect.X < (this.X + this.Width)) && (this.X < (rect.X + rect.Width))) && (rect.Y < (this.Y + this.Height))) && (this.Y < (rect.Y + rect.Height)));
}

如果你自己遵循逻辑,你就会明白为什么你会得到你得到的答案。微软应该做的是:

1)当它看到一个负的宽度/高度使宽度/高度为正,并重新调整左/顶

2)或者在IntersectsWith逻辑中,他们应该在做逻辑时做一些Min(x, x+width)和Min(y, y+width)。

一些比我聪明的人可能有更聪明的方法来做到这一点。

查看这个问题答案的第一条评论。它似乎在说负的高度和负的宽度表示在当前坐标上方和左侧的象限中绘制的矩形。