C# 何时规范化向量?

C# 何时规范化向量?,c#,xna,C#,Xna,我正在学习XNA和几乎所有的网上教育工具包。我总是看到对向量调用Normalize()。我知道normalize基本上将向量转换为单位长度,所以它给出的只是方向 现在我的问题是什么时候正常化,它到底对我有什么帮助。我在做2D编程,所以请用2D概念而不是3D来解释 编辑:这是XNA工具包中的代码,为什么要调用规范化 if (currentKeyboardState.IsKeyDown(Keys.Left) || currentGamePadState.DPad.Left =

我正在学习XNA和几乎所有的网上教育工具包。我总是看到对向量调用Normalize()。我知道normalize基本上将向量转换为单位长度,所以它给出的只是方向

现在我的问题是什么时候正常化,它到底对我有什么帮助。我在做2D编程,所以请用2D概念而不是3D来解释

编辑:这是XNA工具包中的代码,为什么要调用规范化

if (currentKeyboardState.IsKeyDown(Keys.Left) ||
            currentGamePadState.DPad.Left == ButtonState.Pressed)
        {
            catMovement.X -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Right) ||
            currentGamePadState.DPad.Right == ButtonState.Pressed)
        {
            catMovement.X += 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Up) ||
            currentGamePadState.DPad.Up == ButtonState.Pressed)
        {
            catMovement.Y -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Down) ||
            currentGamePadState.DPad.Down == ButtonState.Pressed)
        {
            catMovement.Y += 1.0f;
        }


        float smoothStop = 1;


        if (catMovement != Vector2.Zero)
        {
            catMovement.Normalize();
        }

        catPosition += catMovement * 10* smoothStop;

}

这取决于你使用向量的目的,但是如果你只使用向量来给出方向,那么如果你的向量是单位长度的,那么许多算法和公式就更简单了

例如,角度:两个单位向量
u
v
之间的角度
theta
由公式
cos(theta)=u.v
给出(其中
是点积)。对于非单位向量,必须计算并划分长度:
cos(θ)=(u.v)/(|u|v |)

一个稍微复杂一点的例子:一个向量到另一个向量的投影。如果
v
是单位向量,则
u
v
的正交投影由
(u.v)v
给出,而如果
v
是非单位向量,则公式为
(u.v/v.v)v

换句话说:如果你知道你所需要的只是方向,如果你不确定向量已经是单位向量,那么就进行规范化。这对你很有帮助,因为你可能会一直把你的方向向量除以它们的长度,所以你最好在创建向量的时候只做一次,然后结束它


编辑:我假设在您的示例中调用Normalize的原因是为了能够区分速度的方向和速度。在代码的最后一行,
10*smoothStop
是对象的速度,这很容易知道。要从速度中恢复速度,需要乘以一个单位方向向量。

通过将每个分量除以向量的大小来规范化任何向量,向量的大小由分量平方和的平方根给出。然后,每个分量的幅值在[-1,1]之间变化,且幅值等于1。这是单位向量的定义。

当您需要在一个方向上移动多个单位时,向量规范化的一个常见用例。例如,如果你有一个游戏,其中一个实体a以5个单位/秒的速度向一个实体B移动,你将得到从a到B的向量(即
B-a
),你将对其进行规格化,这样你就只从a的角度保持向实体B的方向,然后你将它乘以5个单位/秒。生成的矢量将是A的速度,然后您可以简单地将其乘以经过的时间,以获得移动对象所需的位移。

在您的示例中,按下键盘可以使您在X或Y方向上移动,或同时在X或Y方向上移动。在X和Y的情况下,当你同时按下右键和下键时,你的动作是对角的。但是,如果仅在X或Y方向的运动就得到了长度为1的向量,那么对角线向量就比1长。也就是说,大约1.4(2的平方根)

如果不规范化运动矢量,则对角线运动将比X或Y运动更快。通过正常化,速度在所有8个方向上都是相同的,我想这就是游戏所要求的