我有这个:
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]
?
我做错了什么?
答案 0 :(得分:23)
答案 1 :(得分:20)
有几件事:
使用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);
}
}
答案 2 :(得分:5)
Sin
和Cos
取弧度值,而不是度数。 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);