所以我试图找出一个点是否包含在矩形内。当矩形的高度和宽度都是正数或负数时,它可以正常工作但不仅一个是负数。一个宽度或高度为负的矩形的整个想法是奇怪的,但当它们都是负数时似乎处理得很好。所以我想知道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;
}
}
}
在这种情况下如何处理它的任何想法?
答案 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;
}