负高度或宽度的矩形不正确使用包含方法?

时间:2012-12-17 19:31:09

标签: c# xna

所以我试图找出一个点是否包含在矩形内。当矩形的高度和宽度都是正数或负数时,它可以正常工作但不仅一个是负数。一个宽度或高度为负的矩形的整个想法是奇怪的,但当它们都是负数时似乎处理得很好。所以我想知道XNA如何处理这种场景中的contains方法?如果它不起作用,它不应该只是不接受它。

我正在使用它来创建一个rts样式选择框,只是为了定义那个矩形,这样我就能分辨出里面的内容。这是我的代码:

if (InputHandler.IsLeftMouseHeld() == true)
{
    selectionBoxRectangle = new Rectangle(selectionBoxRectangle.X,
      selectionBoxRectangle.Y,
      (int)Vector2.Transform(InputHandler.MousePosition(),
      Matrix.Invert(camera.Transformation)).X - selectionBoxRectangle.X,
      (int)Vector2.Transform(InputHandler.MousePosition(),
      Matrix.Invert(camera.Transformation)).Y - selectionBoxRectangle.Y);

    foreach(ControllableCharacter character in characters.OfType<ControllableCharacter>())
    {
        if (selectionBoxRectangle.Contains(character.DestRectangle.Center) == true
          || character.DestRectangle.Contains(selectionBoxRectangle))
        {
            character.Selected = true;
            character.Color = Color.LightGreen;
        }
        else
        {
            character.Selected = false;
            character.Color = Color.White;
        }
    }
}

在这种情况下如何处理它的任何想法?

3 个答案:

答案 0 :(得分:1)

如果您为Rectangle反编译XNA代码,可以在此处查看实现:

public bool Contains(Point value)
{
    return this.X <= value.X && value.X < this.X + this.Width && this.Y <= value.Y && value.Y < this.Y + this.Height;
}

答案 1 :(得分:0)

您总是可以编写自己的方法,这种方法可以比默认方法更好地处理特殊情况。

像这样:

bool RectangleContainsPoint(Rectangle rect, Point p)
{
    if (rect.Width < 0 && rect.Height >=0 ||
        rect.Width >=0 && rect.Height < 0)  // if in this case you have problems

        return MyImplementationOfContains(rect, p);
    else
        return Rectangle.Contains(rect, p);
}

bool MyImplementationOfContains(Rectangle rect, Point p)
{
    // as the name of this method suggests, your implementation
}

答案 2 :(得分:0)

这里的扩展方法可以帮助您在像我一样懒的情况下

public static bool ContainsExt(this RectangleF rect, PointF point)
{
    bool widthOk;
    bool heightOk;

    if (rect.Width < 0)
    {
        widthOk = rect.X >= point.X && point.X > rect.X + rect.Width;
    }
    else
    {
        widthOk = rect.X <= point.X && point.X < rect.X + rect.Width;
    }

    if (rect.Height < 0)
    {
        heightOk = rect.Y >= point.Y && point.Y > rect.Y + rect.Height;
    }
    else
    {
        heightOk = rect.Y <= point.Y && point.Y < rect.Y + rect.Height;
    }

    return widthOk && heightOk;
}