代码之家  ›  专栏  ›  技术社区  ›  Jesse Emond

这个XNA RotateVector2函数有什么问题?

  •  0
  • Jesse Emond  · 技术社区  · 14 年前

    我知道这可能是 非常 这个问题很简单,但我好像搞不懂。首先,我想说明一下,我确实在Google上看了半个小时左右,没有找到问题的答案(是的,我是认真的)。

    基本上,我想围绕一个点旋转一个向量2(在我的例子中,它总是(0,0)向量)。所以,我试着做一个函数,参数是旋转的点和旋转的角度(以度为单位)。

    下面是一个快速绘图,显示了我正在努力实现的目标:

    alt text

    我想取V1(红色向量),旋转一个角度A(蓝色),得到一个新的向量(V2,绿色)。在这个例子中,我使用了一个最简单的例子:轴上的V1,和一个90度角,但我希望函数能处理更多“ 复杂的 “案子也一样。

    public static Vector2 RotateVector2(Vector2 point, float degrees)
    {
        return Vector2.Transform(point, 
        Matrix.CreateRotationZ(MathHelper.ToRadians(degrees)));
    }
    

    那么,我做错了什么?当我运行代码并用(0,-1)向量和90度角调用这个函数时,我得到向量(1,4.371139E-08)。。。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Empyrean    14 年前

    chrisschmich关于浮点精度和使用弧度的回答是正确的。我建议RotateVector2的替代实现,并回答您问题的第二部分。

        public static Vector2 RotateVector2(Vector2 point, float radians)
        {
            float cosRadians = (float)Math.Cos(radians);
            float sinRadians = (float)Math.Sin(radians);
    
            return new Vector2(
                point.X * cosRadians - point.Y * sinRadians,
                point.X * sinRadians + point.Y * cosRadians);
        }
    

    如果要围绕任意点旋转,首先需要平移空间,使要旋转的点为原点,进行旋转,然后反转平移。

        public static Vector2 RotateVector2(Vector2 point, float radians, Vector2 pivot)
        {
            float cosRadians = (float)Math.Cos(radians);
            float sinRadians = (float)Math.Sin(radians);
    
            Vector2 translatedPoint = new Vector2();
            translatedPoint.X = point.X - pivot.X;
            translatedPoint.Y = point.Y - pivot.Y;
    
            Vector2 rotatedPoint = new Vector2();
            rotatedPoint.X = translatedPoint.X * cosRadians - translatedPoint.Y * sinRadians + pivot.X;
            rotatedPoint.Y = translatedPoint.X * sinRadians + translatedPoint.Y * cosRadians + pivot.Y;
    
            return rotatedPoint;
        }
    

    请注意,矢量算法已内联以获得最大速度。

        2
  •  3
  •   Community Ian Goodfellow    7 年前

    您的代码是正确的,这只是一个浮点表示问题。4.371139E-08本质上是零(它是0.0000000431139),但是转换并没有产生一个正好为零的值。这是浮点的一个常见问题,您应该注意。 This SO answer 关于浮点有一些额外的优点。

    另外,如果可能的话,你应该坚持使用弧度而不是度数。这可能会给你的计算带来更多的错误。