私はこれを持っています:
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);