Зажим прямоугольника внутри большего прямоугольника - PullRequest
1 голос
/ 28 марта 2012

Допустим, у меня есть прямоугольник XNA с

X = 0, Y = 0, Width = 25, Height = 25.

. Мне нужен метод для зажима другого прямоугольника внутри, чтобы меньший прямоугольник никогда не «выходил» за границы большего.

Например, если я создаю новый прямоугольник с:

X = 23, Y = 20, Width = 10, Height = 10,

Я хочу, чтобы метод возвращал прямоугольник с:

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

Кроме того, если я создаю новыйПрямоугольник с:

X = -8, Y = 8, Width = 10, = 10,

Я хочу, чтобы метод возвратил прямоугольник с:

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 ]

2 голосов
/ 28 марта 2012

Разве это не просто Rectangle.Intersect?

Создает прямоугольник, определяющий область, в которой один прямоугольник перекрывает другой прямоугольник.

Если меньший прямоугольник полностью находится внутри большего прямоугольника, то пересечение будет таким же, как меньший прямоугольник. Если меньший прямоугольник выходит за пределы большего прямоугольника, эта часть не будет возвращена.

0 голосов
/ 28 марта 2012
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;
    }
}

Я только что набрал код здесь, так что проверьте на наличие орфографических ошибок.
Я не уверен, если свойства с прописными или нет (высота / высота ...)

0 голосов
/ 28 марта 2012

Как насчет этого:

    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;
    }
...