2012-01-21 50 views
1

检查Vector2是否在矩形内的最佳方法是什么?XNA - 检查Vector2是否在矩形内

myRect.contains(myVector2)不起作用,因为它需要一个Point或一个Rectangle。

我知道我可以将Vector2投射到一个点或者甚至是一个尺寸为1/1的矩形,但我不确定性能。

你有什么经验?

回答

1

虽然可能有额外的执行时间铸造VS创造一个像点(myVector2.X,myVector2.Y)点,其意义是最有可能太小了,你有没有注意到(一般应避免过早优化)

与任何看起来最干净和更容易维护。如果是我,我可能只是在方法调用中创建新点...

您也可以编写扩展方法。

public static Point Origin(this Vector2 v) 
    { 
     //original proposal 
     //return new Point((int)v.X, (int)v.Y); 

     //better! does correctly round the values 
     return new Point(Convert.ToInt32(v.X), convert.ToInt32(v.Y)); 
    } 

然后,你可以做这样的事情rect.Contains(vec.Origin)

东西要记住,虽然:这种方法实际上不会检查矢量包含于矩形,如果原产地是这样只会检查。请记住,矢量方向为

+0

@SwissCoder完成。 –

+0

这个四舍五入的表现与铸造不一样。但是当我玩游戏时,我什么也没注意到。 – SwissCoder

+0

为什么当矩形有一个Contains方法时需要使用自定义函数? – xus

4

对于Rectangle结构,Contains的一个重载版本采用X和Y坐标。

Rectangle rect = new Rectangle(-5, -5, 10, 10); 
Vector2 myVector2 = Vector2.Zero; 

rect.Contains((int)myVector2.X, (int)myVector2.Y) 

我假设你说的是代表点而不是距离或方向的myVector2

+0

不,我使用Vector2来存储位置。这不可能是一个点!如果它是一个点,相应对象的翻译(移动)将不会平滑。 – SwissCoder

+0

你已经除外的答案需要一个Vector2,转换为一个Point,然后检查矩形。我的方法跳过转换为一个点的步骤。我没有看到问题。如果一个点不是你想要的,那么你为什么接受你使用一个点的答案。我不确定谁在这里,我或你更困惑。特别是当你刚才说你使用Vector2来存储一个位置时,这使得它成为一个Point。如果你想根据矩形检查这个位置,我的方法就像你要找的那样高效。 –

+0

因为Rectangle.Contains接受整数而不是浮点数,所以需要将X和Y转换为int。 –