c#旋转问题

时间:2011-01-11 20:01:36

标签: c# xna rotation

我有3个粒子,其中一个是中心粒子。我想相对于中心粒子旋转其他两个粒子(存储在粒子列表中),公式为q'=Θq+ p其中q'是旋转粒子的新位置,Θ是方位角,p是位置中心粒子。其他两个粒子的初始位置存储在initialParticlePosition列表中。问题是我认为我计算的角度是错误的,因为范围。我应该把范围作为[-pi,pi)或类似的东西。在某些部分,它计算正确,但有时它是错误的。有人可以帮我这个代码或给我另一种旋转方法。

{

         angle = Math.Acos(Vector2.Dot(heading,new Vector2(0,-1) ));

         for (int i = 0; i < 2; i++)
         {
             tempX = (double)initialParticlePositions[i].X * Math.Cos(angle) - (double)initialParticlePositions[i].Y * Math.Sin(angle) + centerParticle.position.x;
             tempY = (double)initialParticlePositions[i].X * Math.Sin(angle) + (double)initialParticlePositions[i].Y * Math.Cos(angle) + centerParticle.position.y;
             particles[i].position.x = tempX;
             particles[i].position.y = tempY;
         }
}

3 个答案:

答案 0 :(得分:2)

一些可能有用的方法(角度总是以度数,而不是rad):

    public static double GetAngle(Vector v)
    {
        return Math.Atan2(v.X, -v.Y) * 180.0 / Math.PI;
    }

    public static Vector SetAngle(Vector v, double angle)
    {
        var angleInRads = angle * (Math.PI / 180.0);
        var distance = v.Length;
        v.X = (Math.Sin(angleInRads) * distance);
        v.Y = -(Math.Cos(angleInRads) * distance);
        return v;
    }

    static public Point RotatePointAroundCenter(Point point, Point center, double rotationChange)
    {
        Vector centerToPoint = point - center;
        double angle = GetAngle(centerToPoint);
        Vector centerToNewPoint = SetAngle(centerToPoint, angle + rotationChange);
        return center + centerToNewPoint;
    }

(您应该开始标记答案作为答案,点击左侧投票下面的复选标记,例如您可以接受this answer

编辑:稍微优化了方法。

答案 1 :(得分:1)

可以使用单行代码设置绕轨道运行的粒子位置:

假设p1,p2和&amp; p3是Vector2s和p2&amp; p3正在轨道运行p1。

p2 = Vector2.Transform(p2 - p1, Matrix.CreateRotationZ(rotationChangeP2)) + p1;

p3 = Vector2.Transform(p3 - p1, Matrix.CreateRotationZ(rotationChangeP3)) + p1;

Matrix.Create ...()方法将为您调用两个trig函数。

修改。矩阵&amp; Vector2结构&amp;方法是XNA特定的,但包括在这里,因为这是OP标记他的Q.

答案 2 :(得分:0)

angle = Math.Acos(Vector2.Dot(heading,new Vector2(0,-1)));

正如您所怀疑的那样,您的点积和Acos的组合只能为您提供180度的角度  学位范围。

相反,在单位矢量上使用Atan2可以获得从-pi到pi的全范围角度。

angle = (float)Math.Atan2((double)heading.Y, (double)heading.X);

如果你的Y轴向下是正的,你可能需要否定Y项。