我正在进行游戏编程。FWIW 我正在使用XNA,但我怀疑这并不相关。
我想将角度转换为方向向量(即X和Y),其大小为1。
我的原点(0,0)位于左上角。
所以我希望0度转换为[0,-1]
我认为最好的方法是使用矩阵旋转我的North/Up的定义,但似乎这并不起作用。
以下是代码...
public class Conversion
{
public static Vector2 GetDirectionVectorFromDegrees(float Degrees)
{
Vector2 North= new Vector2(0, -1);
float Radians = MathHelper.ToRadians(Degrees);
var RotationMatrix = Matrix.CreateRotationZ(Radians);
return Vector2.Transform(North, RotationMatrix);
}
}
......这里是我的单元测试代码......
[TestFixture]
public class Turning_Tests
{
[Test]
public void Degrees0_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(0);
Assert.AreEqual(0, result.X);
Assert.AreEqual(-1, result.Y);
}
[Test]
public void Degrees90_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(90);
Assert.AreEqual(1, result.X);
Assert.AreEqual(0, result.Y);
}
[Test]
public void Degrees180_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(180);
Assert.AreEqual(0, result.X);
Assert.AreEqual(1, result.Y);
}
[Test]
public void Degrees270_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(270);
Assert.AreEqual(-1, result.X);
Assert.AreEqual(0, result.Y);
}
}
我是否以错误的方式开始? 我应该使用矩阵吗? 我是不是在错误的位置将度数转换为弧度?
我看到有人建议可以使用以下代码来完成此操作:
new Vector2((float)Math.Cos(Angle), (float)Math.Sin(Angle));
...有时候...
new Vector2((float)Math.Sin(Angle), (float)Math.Cos(Angle));
不过这些似乎也不起作用。
有人能帮我找到正确的方法...或者最好是给我一些代码,使得这4个提供的单元测试都通过吗?
非常感谢您的帮助。
Cos
和Sin
的顺序(即先是Cos
(x),然后是Sin
(y),或者反之)的八种可能性,第一个坐标上的符号(减号或不带符号),以及最后一个坐标上的符号。 - Jeppe Stig Nielsen