【问题标题】:Can some please explain why the xna Rectangle struct behaves like it does?有人可以解释为什么 xna Rectangle 结构的行为如此吗?
【发布时间】:2013-06-21 15:49:19
【问题描述】:

我很困惑为什么 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

这表明 Intersects 方法可以正常工作,因为 bounds 不与 bounds2 重叠,但 bounds2 确实与 bounds3 重叠一行像素。

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

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

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

谢谢

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    我真的没有看到你的问题。如果一个矩形从Left = 1 开始,Width 为 3,那么它从像素 1 到 4:

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

    然后矩形从像素 1 的左上角延伸到像素 4 的左上角。您可能会感到困惑的是,像素 4 的左上角是像素 3 的右上角。但仅此而已到你对矩形的解释。如果你的解释保持一致,那么一切都说得通。

    【讨论】:

    • 感谢您提供图表和 cmets,这有助于理解为什么 Rectangle 结构是这样设计的。
    【解决方案2】:

    Windows API Rect 结构也是如此,至少可以追溯到 Windows 3.x。

    这样做的原因是它简化了一些计算。

    这是 2004 年关于它的博客条目:http://blogs.msdn.com/b/oldnewthing/archive/2004/02/18/75652.aspx

    请注意,出于类似原因,GDI 线图(可能还有 XNA 线图)也使用专有端点。

    【讨论】:

    • 谢谢!这开始让我发疯了。您链接的文章解释了很多。我将尝试摆脱目前对坐标的思考方式,并描绘坐标之间的像素,而不是直接与它们对齐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多