2010-02-07 5 views
10

Je suis habitué aux graphismes WinForms, mais j'ai déjà utilisé XNA, et une chose que j'ai remarquée est que l'objet Point n'est pas très utile, et ne semble pas très utilisé. Pour le positionnement, les différentes méthodes SpriteBatch Draw utilisent un Rectangle ou un Vector2. Et Vector2 a beaucoup de méthodes statiques et d'instance utiles, alors que Point n'a fondamentalement rien sauf les propriétés X et Y.XNA - Pourquoi utilise-t-on Vector2 et pas Point?

Pourquoi XNA utilise-t-il un Vector2 pour représenter la position au lieu d'un Point? Je me rends compte qu'ils ont tous deux un X et un Y, mais sémantiquement et logiquement, en utilisant un Vector2 au lieu d'un Point pour représenter l'emplacement n'a aucun sens pour moi. (Par exemple, si vous normaliser le Vector2, vous avez soudainement un emplacement différent!)

Est-ce aussi étrange que cela semble, ou ai-je oublié quelque chose?

+5

Je pense qu'une meilleure question est: pourquoi XNA a-t-il une classe 'Point'? Pourquoi ne pas avoir 'Vector2' et' Vector2f' comme tous les autres frameworks? En l'état actuel des choses, je dois constamment traduire de 'Point' à' Vector2' et vice versa. –

Répondre

16

Même en supposant que Point utilisait des valeurs flottantes, quelle signification donneriez-vous à "ajouter 2 points ensemble"? Maintenant, ajouter des vecteurs pour mettre à jour des positions est un concept bien compris et largement utilisé, de sorte que les vecteurs correspondent mieux à la description des positions et des vitesses dans un monde virtuel.

+1

Je suppose que cela a du sens. J'avais oublié, mais la structure Point dans System.Drawing n'ajoute pas vraiment de Point à un autre Point; il ajoute une taille à un point. Et je me souviens avoir fait de l'arithmétique vectorielle dans la physique du lycée. –

+0

Juste imo, mais je pense que l'ajout d'un vecteur (vecteur de déplacement) à un point pour obtenir un nouveau point a plus de sens. Mais je vois pourquoi ils l'ont fait de cette façon dans XNA. – Ataraxia

0

Raison principale ... Vector2 utilise des flottants et des champs au lieu de propriétés. Cela le rend plus précis et plus efficace que Point, qui utilise des entiers et des propriétés.

+2

Mais il pourrait certainement y avoir une classe PointF, comme dans System.Drawing: http://msdn.microsoft.com/en-us/library/system.drawing.pointf.aspx –

0

À un certain niveau, vous voulez juste un tuple de nombres. Plus haut, vous voudrez peut-être appliquer quelques abstractions et structure sur ces tuples. Cependant, en tant que bibliothèque de mathématiques haute performance, XNAMath vous laisse le soin de travailler.

+2

Je ne comprends pas cette réponse. –

2

Sémantiquement, il y a peu de différence entre un vecteur et un point; ils représentent tous les deux un déplacement d'une origine dans un système de coordonnées cartésien. L'avantage des vecteurs est qu'ils ont plus de structure (échelle, addition, etc.) que de points. Par exemple, vous pouvez rechercher le déplacement d'une entité par rapport à une autre: il s'agit simplement de la différence vectorielle entre leurs vecteurs de position respectifs. Ils sont également plus polyvalents dans la représentation d'autres quantités, telles que la vélocité. Par exemple, vous pouvez vouloir calculer la position d'une entité avec la position r et la vitesse v après un intervalle de temps t; en utilisant des vecteurs, cela pourrait être calculé simplement par r + t * v.

Votre exemple de normalisation pourrait être utile si vous souhaitez que l'entité soit dirigée depuis l'origine (ou un autre point).

3

Je pensais partager une petite magie d'extension, puisque j'adore les extensions. J'ai créé une méthode d'extension de point pour convertir facilement à un Vector2 pour comme SpriteBatch.Draw()

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

ensuite appeler simplement avec myPoint.ToVector2().

Pas l'utilisation la plus significative d'une extension, mais cela rend ma vie un peu plus facile.