2010-02-07 9 views
10

Estoy acostumbrado a los gráficos de WinForms, pero he estado incursionando en XNA, y una cosa que he notado es que el objeto Point no es muy útil, y parece que no se usa mucho. Para el posicionamiento, los diversos métodos de dibujo SpriteBatch utilizan Rectangle o Vector2. Y Vector2 tiene muchos métodos estáticos y de instancia útiles, mientras que Point básicamente no tiene nada excepto las propiedades X e Y.XNA - ¿Por qué usa Vector2 y no Point?

¿Por qué XNA usa un Vector2 para representar la posición en lugar de un Point? Me doy cuenta de que ambos tienen una X y una Y, pero semánticamente y lógicamente, usar un Vector2 en lugar de un Point para representar la ubicación no tiene sentido para mí. (Por ejemplo, si normaliza el Vector2, de repente tiene una ubicación diferente!)

¿Es esto tan extraño como parece, o me falta algo?

+5

Creo que una mejor pregunta es, ¿por qué XNA tiene una clase 'Point' en absoluto? ¿Por qué no tener 'Vector2' y' Vector2f' como cualquier otro framework? Tal como está ahora, me encuentro teniendo que traducir constantemente de 'Point' a' Vector2' y viceversa. –

Respuesta

16

Incluso asumiendo que Point estaban usando valores float, ¿qué significaría para "agregar 2 puntos juntos"? Ahora agregar vectores para actualizar las posiciones es un concepto bien conocido y ampliamente utilizado, por lo que los vectores se asignan mejor a la descripción de posiciones y velocidades en un mundo virtual.

+1

Supongo que esto tiene sentido. Lo había olvidado, pero la estructura de puntos en System.Drawing en realidad no agrega un punto a otro punto; Agrega un Tamaño a un Punto. Y recuerdo haber hecho aritmética vectorial en la física de la escuela secundaria. –

+0

Simplemente, pero creo que agregar un vector (es decir, un vector de desplazamiento) a un punto para obtener un nuevo punto tiene más sentido. Pero veo por qué lo hicieron de esta manera en XNA. – Ataraxia

0

Motivo principal ... Vector2 utiliza flotantes y campos en lugar de propiedades. Esto lo hace más preciso y más eficiente que Point, que usa enteros y propiedades.

+2

Pero ciertamente podría haber una clase PointF, como hay en System.Drawing: http://msdn.microsoft.com/en-us/library/system.drawing.pointf.aspx –

0

En cierto nivel, solo quiere una tupla de números. Más arriba, puede aplicar algunas abstracciones y estructura sobre esas tuplas. Sin embargo, como una biblioteca matemática de alto rendimiento, XNAMath deja eso a su altura.

+2

No entiendo esta respuesta. –

2

Semánticamente hay poca diferencia entre un vector y un punto; ambos representan un desplazamiento desde un origen en algún sistema de coordenadas cartesianas. La ventaja de los vectores es que tienen más estructura (escalado, adición, etc.) que puntos.

Por ejemplo, es posible que desee encontrar el desplazamiento de una entidad de otra: esta es simplemente la diferencia vectorial entre sus respectivos vectores de posición. También son más versátiles al representar otras cantidades, como la velocidad. Por ejemplo, es posible que desee calcular la posición de una entidad con la posición r y la velocidad v después de un intervalo de tiempo de t; usando vectores, esto podría calcularse simplemente por r + t * v.

Su ejemplo de normalización podría ser útil si desea la dirección de la entidad desde el origen (o algún otro punto).

3

Pensé en compartir una pequeña extensión de magia, ya que me encantan las extensiones. creé un método de extensión de punto para convertir fácilmente a un Vector2 para como SpriteBatch.Draw()

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

entonces simplemente lo llaman con myPoint.ToVector2().

No es el uso más significativo de una extensión, pero me hace la vida un poco más fácil.

Cuestiones relacionadas