Ror*_*ker 7 c# xna vector rotation degrees
我正在做一些游戏编程.FWIW我正在使用XNA,但我怀疑这是否相关.
我想将度数转换为幅度为1的方向向量(即X和Y).
我的起源(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);
}
}
Run Code Online (Sandbox Code Playgroud)
......这是我的单元测试......
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
我接近这一切都错了吗?我应该使用矩阵吗?我搞砸了,在错误的地方从度数转换成弧度?
我已经看到过这样的建议,可以使用以下代码完成:
new Vector2((float)Math.Cos(Angle), (float)Math.Sin(Angle));
Run Code Online (Sandbox Code Playgroud)
......或者有时......
new Vector2((float)Math.Sin(Angle), (float)Math.Cos(Angle));
Run Code Online (Sandbox Code Playgroud)
然而,这些似乎也不起作用
有人可以把我放在正确的道路上......或者更好的是给我一些代码,这会导致4个提供的单元测试路径?
提前谢谢了.
Jep*_*sen 15
只需使用:
new Vector2((float)Math.Cos(radians), (float)Math.Sin(radians))
Run Code Online (Sandbox Code Playgroud)
一定要用这种方法从度数转换为弧度.
这使用了数学家的开始[1, 0]和朝向的方向[0, 1](即逆时针方向与数学家用于两个轴的方向).
要使用您的约定(从[0, -1]方向开始[1, 0]),您需要:
new Vector2((float)Math.Sin(radians), -(float)Math.Cos(radians))
Run Code Online (Sandbox Code Playgroud)
请注意,从度数到弧度的转换永远不会是精确的(它涉及到某些内容?).您应该在测试中允许一些容差.另外,如果你使用double的,而不是float为radians,你将不得不在中间计算一些额外的精度.