【问题标题】:Shifting angles while using Atan2使用 Atan2 时移动角度
【发布时间】:2020-11-11 08:08:18
【问题描述】:

我目前正在使用 Atan2 来计算玩家的航向角。

但是经过一些尝试和错误后,我发现游戏中的角度与“正常”布局的角度有很大不同:

        ReturnedAngle = Math.Atan2(Y2 - Y1, X2 - X1);  /// ArcTan2 the difference in our Y axis is always passed first followed by X

        ReturnedAngle = (180 / Math.PI) * ReturnedAngle; /// Converting our radians to Degrees the convervion ends at 358 not the full 360 degrees.

        ReturnedAngle = Math.Round(ReturnedAngle + 360, MidpointRounding.AwayFromZero) % 360; /// MOD and round our angle.

上面是我用来计算航向角的 C# 代码。我的问题是如何将这个角度从“正常”角度系统转换为游戏中的角度系统。

【问题讨论】:

  • 能否在左图显示 Y 轴和 X 轴方向?点 (100,100) 和 (100, -100) 在哪里?

标签: c# math angle atan2


【解决方案1】:

我认为这是你的情况。您有一个右手坐标系,但您测量的是顺时针角度,这是不一致的。

无论如何,从 360 度(下图红色)画一个小的正角,形成一个正边的直角三角形(下图紫色)。

要测量三角形的角度 θ,请测量短边 Δx 和长边 Δy 并计算。

var θ = Math.Atan2(Δx, Δy);

这适用于两侧的任何正值或负值。例如,如果角度超过 90°,则Δy 将翻转标志,因为您的目标点将低于原点。但是Atan2() 的美妙之处在于,您无需担心这些情况,因为如果您使其适用于一个小的正角,它适用于所有四个象限。

反过来你有

var Δx = R*Math.Sin(Θ);
var Δy = R*Math.Cos(Θ);

其中R 是目标与参考点之间的距离。

【讨论】:

  • 感谢您的回答,但我不能说我理解。我既有玩家当前的位置,也有玩家前进的航点的位置。你能用数学公式解释一下吗?
  • 你需要在图表上加上x和y轴的方向才能推导出公式。你是上升还是下降?
  • 啊,是的,如果你面向 360 度(在游戏中)向前移动,你会增加 Y 轴,这很正常。如果你面对 90 度(在游戏中)并向前移动,你会增加你的 X 轴。
【解决方案2】:

Math.Atan2(Y2 - Y1, X2 - X1) 从 x 轴逆时针计算角度。 Math.Atan2(X2 - X1, Y2 - Y1) 计算从 y 轴顺时针方向的角度,这就是您想要的。

“从北顺时针”惯例用于导航和地图绘制。多年来,我发现用具有北、东分量的向量来思考是最容易的。这意味着atan2的调用方式相同,即从p得到q的方向:

dirn = atan2( q[1]-p[1], q[0]-p[0]);

如果您将 p 和 q 视为 x,y 向量,这将为您提供与 x 轴逆时针方向的角度。如果您将 p 和 q 视为 n,e 向量,它会为您提供从北顺时针方向的角度。

这也意味着旋转矩阵的公式是相同的。要旋转角度 a,请使用矩阵

R = ( cos(a)  -sin(a) )
    ( sin(a)   cos(a) )

同样,如果您将向量视为 x,y,则应用 R 旋转通过并从轴逆时针旋转角度 a,而如果您将向量视为 n,则应用 R 旋转角度a,从北顺时针方向。

【讨论】:

  • 嘿伙计,感谢您在实施您的方法后的响应,它似乎朝着相反的方向前进。我这样称呼它: ReturnedAngle = Math.Atan2(X2 - X1, Y2 - Y1);然后我简单地将返回值转换为度数(从弧度)然后我将 360 度添加到该角度并将其移动 360 度。然后我将返回的角度设置为游戏中......抱歉我知道我的数学不是角度/方向的最剧烈变化让我失望。还有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2014-07-22
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多