Как повернуть 2d вектор?

У меня есть это:

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 ответа

Решение

Угол измеряется в радианах, а не в градусах. См. http://msdn.microsoft.com/en-us/library/system.math.cos(v=vs.110).aspx

Пара вещей: использование Vector представлять векторы.

  • vX читает лучше, чем 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);
    }
}

Sin а также Cos принимать значения в радианах, а не в градусах. 180 градусов Math.PI радиан.

Альтернатива, если вы хотите использовать градусы без преобразования с использованием матрицы:

    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);
Другие вопросы по тегам