我很困惑为什么XNA Rectangle结构就像它一样。
如果我运行此代码:
var bounds = new Rectangle(0, 0, 10, 10);
var bounds2 = new Rectangle(0, 10, 10, 10);
var bounds3 = new Rectangle(0, 19, 10, 10);
Debug.Print("Bounds X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds.X, bounds.Y, bounds.Top, bounds.Left, bounds.Bottom, bounds.Right);
Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds2.X, bounds2.Y, bounds2.Top, bounds2.Left, bounds2.Bottom, bounds2.Right);
Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
bounds3.X, bounds3.Y, bounds3.Top, bounds3.Left, bounds3.Bottom, bounds3.Right);
Debug.Print("bounds.Intersects(bounds2): {0}", bounds.Intersects(bounds2));
Debug.Print("bounds2.Intersects(bounds3): {0}", bounds2.Intersects(bounds3));
我得到以下输出:
Bounds X: 0, Y: 0, Top: 0 Left: 0 Bottom: 10 Right 10
Bounds2 X: 0, Y: 10, Top: 10 Left: 0 Bottom: 20 Right 10
Bounds2 X: 0, Y: 19, Top: 19 Left: 0 Bottom: 29 Right 10
bounds.Intersects(bounds2): False
bounds2.Intersects(bounds3): True
这表明相交方法正常工作,bounds
不重叠bounds2
,但bounds2
重叠bounds3
一行像素。
然而Bottom
和Right
的输出对我来说似乎很奇怪。
它们都报告的值比我认为的要大1个像素,并且总是被它抓住,导致沮丧。
例如,我可能会使用矩形为矩形精灵创建一个边界框。
为方便起见,我想使用Width
,Height
,Right
和Bottom
值,但Right
和Bottom
值不给我纹理的像素的底行和右列,它们返回底部正下方的行和纹理右侧的列。
它有这么好的理由吗? 你是否在XNA中使用Rectangle作为边界框,如果是这样,你会注意到相同的行为,或者你能提出任何建议来改进我的方法吗?
由于
答案 0 :(得分:5)
我真的没有看到你的问题。如果矩形从Left = 1
开始并且Width
为3,则它从1到4的像素到达:
在上图中,我选择了像素的中心作为其位置。如果我们说,像素的位置是它的左上角,那么该图看起来如下:
然后矩形从像素1的左上角到达像素4的左上角。可能会让你感到困惑的是,像素4的左上角是像素3的右上角。但是这一切都已经完成了你对矩形的解释。如果你保持解释一致,那么这一切都是有道理的。
答案 1 :(得分:3)
Windows API Rect
结构也是如此,至少可以追溯到Windows 3.x.
原因在于它简化了一些计算。
以下是2004年的博客文章:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/18/75652.aspx
请注意,GDI线条图(也可能是XNA线条图)也使用独占端点,原因类似。