2010-02-07 21 views
10

我習慣了WinForms圖形,但是我一直在XNA中涉獵,我注意到的一件事是Point對象不是非常有用,似乎並沒有太多用處。對於定位,各種SpriteBatch繪圖方法使用RectangleVector2Vector2有很多有用的靜態和實例方法,而Point除了X和Y屬性外幾乎沒有任何內容。XNA - 爲什麼它使用Vector2而不是Point?

爲什麼XNA使用Vector2來表示位置而不是Point?我意識到他們都有X和Y,但在語義和邏輯上,使用Vector2而不是來表示位置對我來說沒有意義。 (例如,如果你正常化Vector2,突然你有一個不同的位置!)

這是很奇怪,因爲它似乎,或者我錯過了什麼?

+5

我認爲一個更好的問題是,爲什麼XNA有一個'Point'類呢?爲什麼不像每個其他框架一樣有'Vector2'和'Vector2f'?現在,我發現自己必須不斷從'Point'轉換到'Vector2'並返回。 –

回答

16

即使假設Point正在使用浮點值,您會給「一起添加2點」有什麼含義?現在添加矢量來更新位置是一個很好理解和廣泛使用的概念,因此矢量更好地描述虛擬世界中的位置和速度。

+1

我想這是有道理的。我忘記了,但System.Drawing中的Point結構實際上並沒有將Point添加到另一個Point;它將大小添加到一個點。我回想起在高中物理中做矢量算術。 –

+0

只是imo,但我認爲添加一個矢量(即位移矢量)到一個點來獲得一個新的點更有意義。但我明白他們爲什麼在XNA中這樣做。 – Ataraxia

0

主要原因... Vector2使用浮動和字段代替屬性。這使得它比使用整數和屬性的Point更精確和更高效。

+2

但是肯定有一個PointF類,就像在System.Drawing中一樣:http://msdn.microsoft.com/en-us/library/system.drawing.pointf.aspx –

0

在某個層次上,你只需要一個數字元組。越高,你可能想要對這些元組應用一些抽象和結構。然而,作爲一個高性能的數學庫,XNAMath將會爲您提供幫助。

+2

我不明白這個答案。 –

2

語義上,矢量和點之間幾乎沒有區別;它們都代表了一些笛卡爾座標系中原點的位移。向量的優點是它們具有比點更多的結構(縮放,添加等)。

例如,您可能想要查找一個實體從另一個實體的位移:這只是它們各自位置向量之間的向量差。它們在代表其他數量方面也更加通用,如速度。例如,您可能想要計算一個位置r和速度v在時間間隔t之後的位置;使用矢量,這可以簡單地通過r + t * v來計算。

如果你想要從原點(或其他點)到實體的方向,規範化的例子可能會很有用。

3

以爲我會分享一個小擴展魔術,因爲我喜歡擴展。 我創建的點擴展方法用於容易地轉換成Vector2像SpriteBatch.Draw()

public static class PointExt 
{ 
    public static Vector2 ToVector2(this Point point) 
    { 
     return new Vector2(point.X, point.Y); 
    } 
} 

然後簡單地用myPoint.ToVector2稱之爲()。

擴展名不是最有意義的用法,但它使我的生活稍微容易一些。

相關問題