Pregunta

He estado trabajando con Vector2 y XNA, y descubrí que llamar a la función miembro Normalize () en un Vector cero lo normaliza a un vector de {NaN, NaN}. Todo esto está muy bien, pero en mi caso preferiría dejarlo como cero vectores.

Agregar este código a mi proyecto permitió un lindo método de extensión:

using ExtensionMethods;

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static Vector2 NormalizeOrZero(this Vector2 v2)
        {
            if (v2 != Vector2.Zero)
                v2.Normalize();
            return v2;
        }
    }
}

Desafortunadamente, este método devuelve el vector normalizado, en lugar de simplemente normalizar el vector que utilizo para invocar este método de extensión. En cambio, me gustaría comportarme como vector2Instance .Normalize () lo hace.

Además de hacer este vacío, ¿cómo ajusto esto para que se modifique 'v2'? (Esencialmente, necesito acceso al objeto 'this', o necesito que 'v2' se pase por referencia).

Editar:

Y sí, he intentado esto:

    public static void NormalizeOrZero(this Vector2 v2)
    {
        if (v2 != Vector2.Zero)
            v2.Normalize();
    }

No funciona, v2 es solo una variable en el alcance de NormalizeOrZero.

¿Fue útil?

Solución

Esto no funciona porque el Vector 2 es en realidad una estructura . Esto significa que se pasa por valor y no puede modificar la copia de la persona que llama. Creo que lo mejor que puede hacer es la solución especificada por lomaxxx.

Esto ilustra por qué generalmente debe evitar el uso de estructuras. Consulte esta pregunta para obtener más información. Vector2 viola la directriz de que las estructuras deberían ser inmutables, pero probablemente tenía sentido hacerlo en el contexto de XNA.

Otros consejos

Bueno, si realmente estás muriendo para hacer esto, puedes hacer algo como esto:

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
    if (v2 != Vector2.Zero)
        v2.Normalize();
}

Lo llamarías de esta manera:

v2.NormalizeOrZero(ref v2);

Es muy feo, pero funcionará, por lo que vale. Pero en ese punto, también puede llamar a un método estático en primer lugar.

No estoy seguro de por qué su segundo ejemplo de código no funciona, pero si el primer lote de código hace lo que desea, simplemente puede solucionarlo yendo a:

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();

Necesitaría tanto el ref como el modificador this en el argumento, lo que parece poco probable que funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top