如何旋转2d矢量?

时间:2014-04-02 17:17:43

标签: c# rotation vector-graphics

我有这个:

static double[] RotateVector2d(double x, double y, double degrees)
{
    double[] result = new double[2];
    result[0] = x * Math.Cos(degrees) - y * Math.Sin(degrees);
    result[1] = x * Math.Sin(degrees) + y * Math.Cos(degrees);
    return result;
}

当我打电话

RotateVector2d(1.0, 0, 180.0)

结果是:[-0.59846006905785809, -0.80115263573383044]

该怎么做,结果是[-1, 0]

我做错了什么?

4 个答案:

答案 0 :(得分:23)

答案 1 :(得分:20)

有几件事: 使用Vector来表示向量。

  • v.X读取优于v [0]
  • 这是一个结构,所以它会有很好的表现。
  • 请注意Vector是一个可变结构。

对于轮换,也许扩展方法是有意义的:

using System;
using System.Windows;

public static class VectorExt
{
    private const double DegToRad = Math.PI/180;

    public static Vector Rotate(this Vector v, double degrees)
    {
        return v.RotateRadians(degrees * DegToRad);
    }

    public static Vector RotateRadians(this Vector v, double radians)
    {
        var ca = Math.Cos(radians);
        var sa = Math.Sin(radians);
        return new Vector(ca*v.X - sa*v.Y, sa*v.X + ca*v.Y);
    }
}

答案 2 :(得分:5)

SinCos取弧度值,而不是度数。 180度是Math.PI弧度。

答案 3 :(得分:1)

如果您想使用Matrix而不使用转换来使用度数,请选择

    System.Windows.Media.Matrix m = new System.Windows.Media.Matrix();
    m.Rotate((double)angle_degrees);
    System.Windows.Vector v = new System.Windows.Vector(x,y);
    v = System.Windows.Vector.Multiply(v, m);