2012-01-21 62 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。 –