Как повернуть 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);