J'ai ceci:
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;
}
Quand j'appelle
RotateVector2d(1.0, 0, 180.0)
le résultat est: [-0.59846006905785809, -0.80115263573383044]
Que faire pour que le résultat soit [-1, 0]
?
Qu'est-ce que je fais mal?
L'angle est mesuré en radians et non en degrés. Voir http://msdn.Microsoft.com/en-us/library/system.math.cos(v=vs.110).aspx
Quelques choses: Utilisez Vector
pour représenter les vecteurs.
Vector
est une structure mutable.Pour la rotation, une méthode d'extension a peut-être un sens:
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
et Cos
prennent des valeurs en radians et non en degrés. 180 degrés est Math.PI
radians.
Alternative si vous souhaitez utiliser des degrés sans conversion à l'aide de 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);