负大小的矩形如何相交?

dlr*_*as2 10 c# intersection

有人可以解释为什么负面大小的Rectangles与他们的方式相交吗?

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
Run Code Online (Sandbox Code Playgroud)

我会思考r1并且r2应该总是相交r,即使他们没有.r3如果你考虑它们的负面大小,应该相交.如果不考虑负尺寸,r0则应相交.

为什么它的工作方式如此,以及在使用Rectangle结构时我应该注意哪些其他注意事项?

Jas*_*ore 8

如果创建一个负宽度的矩形,则会绘制一个从原始(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();
Run Code Online (Sandbox Code Playgroud)

输出如下:

5
4
2
4
-1
-2
Run Code Online (Sandbox Code Playgroud)

鉴于微软对其他类似矩形的控件(除System.Drawing.Rectangle之外)的评论,这种行为有些预期.请在此处查看MSDM .

现在,为什么矩形的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)));
}
Run Code Online (Sandbox Code Playgroud)

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

1)当它看到负宽度/高度时,使宽度/高度为正,并重新调整左/上

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

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