Ответ 1
Угол измеряется в радианах, а не в градусах. См. http://msdn.microsoft.com/en-us/library/system.math.cos(v=vs.110).aspx
У меня есть это:
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]
?
Что я делаю неправильно?
Угол измеряется в радианах, а не в градусах. См. http://msdn.microsoft.com/en-us/library/system.math.cos(v=vs.110).aspx
Несколько вещей:
Используйте Vector
для представления векторов.
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);