在较大的矩形内部夹紧矩形

时间:2012-03-28 13:17:17

标签: c# xna xna-4.0

假设我有一个带

的XNA矩形
X = 0, Y = 0, Width = 25, Height = 25.

我想要的是一种在内部夹住另一个矩形的方法,这样较小的矩形永远不会“离开”较大的矩形。

例如,如果我用:

创建一个新的Rectangle
X = 23, Y = 20, Width = 10, Height = 10,

我希望该方法返回一个Rectangle:

X = 23, Y = 20, Width = 2, Height = 5.

另外,如果我用:

创建一个新的Rectangle
X = -8, Y = 8, Width = 10, = 10,

我希望该方法返回一个Rectangle:

X = 0, Y = 8, Width = 2, Height = 10.

同时我得到了钳位工作。仍然是它的大量丑陋代码,所以新问题是,我该如何简化这个?

if (SelectionRectangle.X < 0)
        {
            SelectionRectangle.Width = SelectionRectangle.Width + SelectionRectangle.X;
            SelectionRectangle.X = 0;
        }
        if (SelectionRectangle.X + SelectionRectangle.Width > tileset.Width)
        {
            if (SelectionRectangle.X > tileset.Width)
            {
                SelectionRectangle.X = tileset.Width;
                SelectionRectangle.Width = 0;
            }
            else
            {
                SelectionRectangle.Width = tileset.Width - SelectionRectangle.X;
            }
        }
        if (SelectionRectangle.Y < 0)
        {
            SelectionRectangle.Height = SelectionRectangle.Height + SelectionRectangle.Y;
            SelectionRectangle.Y = 0;
        }
        if (SelectionRectangle.Y + SelectionRectangle.Height > tileset.Height)
        {
            if (SelectionRectangle.Y > tileset.Height)
            {
                SelectionRectangle.Y = tileset.Height;
                SelectionRectangle.Height = 0;
            }
            else
            {
                SelectionRectangle.Height = tileset.Height - SelectionRectangle.Y;
            }
        }

3 个答案:

答案 0 :(得分:2)

这不仅仅是Rectangle.Intersect吗?

  

创建一个Rectangle,用于定义一个矩形与另一个矩形重叠的区域。

如果较小的矩形完全在较大的矩形内,则交点将与较小的矩形相同。如果较小的矩形延伸到较大的矩形之外,则不会返回该部分。

答案 1 :(得分:0)

这样的事情怎么样:

    Rectangle clamp(Rectangle smaller, Rectangle larger)
    {
        Rectangle ret;
        ret.X = Math.Max(smaller.X, larger.X);
        ret.Y = Math.Max(smaller.Y, larger.Y);
        ret.Width = Math.Min(smaller.X + smaller.Width, larger.X + larger.Width) - ret.X;
        ret.Height = Math.Min(smaller.Y + smaller.Height, larger.Y + larger.Height) - ret.Y;
        return ret;
    }

答案 2 :(得分:0)

private void ClampRectangle(Rectangle outside, Rectangle inside) {
    if(inside.left < outside.left) {
        inside.width -= outside.left - inside.left;
        inside.left = outside.left
    }
    if(inside.right > outside.right) {
        inside.width -= inside.right - outside.right;
    }
    if(inside.top < outside.top) {
        inside.height -= outside.top - inside.top;
        inside.top = outside.top;
    }
    if(inside.bottom > outside.bottom) {
        inside.height -= inside.height - outside.height;
    }
}

我只是在这里输入代码,因此请检查拼写错误 我不确定这些属性是否有大写字母(高度/高度......)