有人可以解释为什么xna Rectangle结构的行为与它一样吗?

时间:2013-06-21 07:25:31

标签: c# xna

我很困惑为什么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一行像素。

然而BottomRight的输出对我来说似乎很奇怪。 它们都报告的值比我认为的要大1个像素,并且总是被它抓住,导致沮丧。

例如,我可能会使用矩形为矩形精灵创建一个边界框。 为方便起见,我想使用WidthHeightRightBottom值,但RightBottom值不给我纹理的像素的底行和右列,它们返回底部正下方的行和纹理右侧的列。

它有这么好的理由吗? 你是否在XNA中使用Rectangle作为边界框,如果是这样,你会注意到相同的行为,或者你能提出任何建议来改进我的方法吗?

由于

2 个答案:

答案 0 :(得分:5)

我真的没有看到你的问题。如果矩形从Left = 1开始并且Width为3,则它从1到4的像素到达:

Rectangle

在上图中,我选择了像素的中心作为其位置。如果我们说,像素的位置是它的左上角,那么该图看起来如下:

Rectangle

然后矩形从像素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线条图)也使用独占端点,原因类似。