1

我一直在使用 Vector2 和 XNA,我发现在零向量上调用 Normalize() 成员函数会将其归一化为 {NaN,NaN} 的向量。这一切都很好,但在我的情况下,我更喜欢它而不是将它们保留为零向量。

将此代码添加到我的项目中启用了一个可爱的扩展方法:

using ExtensionMethods;

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

不幸的是,这个方法返回了标准化的向量,而不是简单地标准化我用来调用这个扩展方法的向量。我想改为像vector2Instance .Normalize() 那样行事。

除了使这个无效之外,我该如何调整它以修改“v2”?(本质上,我需要访问“this”对象,或者我需要通过引用传递“v2”。)

编辑:

是的,我试过这个:

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

不行,v2只是NormalizeOrZero范围内的一个变量。

4

4 回答 4

3

这不起作用,因为 Vector 2实际上是一个 struct。这意味着它是按值传递的,您不能修改调用者的副本。我认为你能做的最好的就是lomaxxx指定的解决方法。

这说明了为什么您通常应该避免使用结构。有关更多信息,请参阅此问题。Vector2 违反了结构应该是不可变的准则,但在 XNA 的上下文中这样做可能是有意义的。

于 2008-11-20T01:40:31.957 回答
1

好吧,如果你真的很想这样做,你可以这样做:

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

你会这样称呼它:

v2.NormalizeOrZero(ref v2);

它非常丑陋,但它会起作用,因为它的价值。但是此时您也可以首先调用静态方法。

于 2008-11-20T01:49:43.763 回答
0

我不确定为什么您的第二个代码示例不起作用,但如果第一批代码符合您的要求,您可以简单地通过以下方式解决它:

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();
于 2008-11-20T01:30:27.250 回答
0

您需要参数上的 therefthis修饰符,这似乎不太可能起作用。

于 2008-11-20T01:42:06.743 回答