有人可以解释为什么负面大小的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
我认为r1
和r2
应始终与r
相交,即使他们不这样做。如果你考虑它们的负面大小,r3
应该相交。如果不考虑负尺寸,r0
应相交。
为什么这会以它的方式工作,以及在使用Rectangle
结构时我应该注意哪些其他注意事项?
答案 0 :(得分: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();
输出如下:
5
4
2
4
-1
-2
鉴于微软对其他类似矩形的控件(除了System.Drawing.Rectangle之外)的评论,这种行为有些预料。请参阅MSDM here。
现在,为什么矩形的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)。
其他一些比我聪明的人可能有更聪明的方法来做到这一点。
答案 1 :(得分:0)
查看this question答案的第一条评论。似乎是说负高度和宽度表示在当前坐标的上方和左侧的象限中绘制的矩形。