2

毫无疑问,这个问题之前已经被问过,除了我完全缺乏找到它的知识。

我正在尝试编写经典的蛇(又名 Nibbles)游戏,逻辑非常简单。方向由增量坐标对表示。北是-1, 0;东是 0, 1; 南是 1,0;西是0,-1。

我上数学课已经十年了,所以我不确定如何将这些对转换为北 = 0 度的东西;东 = 45,南 = 90;和 west = 135 在这种情况下,问题非常简单,成为时钟算术然后转换回增量对的情况。

此外,这不是学术作业,而是自我教育

编辑:由于下面选择的答案,得到了一个工作原型。 http://ominian.com/examples/js/pinglib/snakes.html

4

3 回答 3

2
  1. 如果您真的是指度数,那么您需要 90 度而不是 45 度的增量。

  2. 您需要该atan2功能(以多种语言形式存在)。类似的东西angle = 180/pi * atan2(dy,dx)--180/pi是因为atan2返回一个弧度值。这与您想要的内容之间会有许多小的不匹配:dy将被视为向上而不是向下增加,0 将是东而不是北,并且atan2通常返回 -pi 和 +pi 之间的值而不是 0 和 2pi 之间的值。解开所有这些问题留给读者作为练习:-)。

  3. 如果您只需要您描述的 4 种特殊情况,那么您可以做一些丑陋和临时的事情。例如,angle = 180*(dy-dx>0)+90*(dx!=0)将做这项工作,因为 S,W 共享dy-dx>0和 E,W 共享的属性dx!=0

  4. 您可能会发现在dx,dy任何地方都使用值而不明确使用角度会更好。例如,旋转 90 度只是(dx,dy)=(-dy,dx)(或(dy,-dx)另一个方向)。

于 2011-03-27T00:13:28.677 回答
1

您想要的函数是 atan2() - 两个参数的反正切。它是专门为此目的而存在的。当然,它以弧度返回结果,因此您必须转换为度数,并返回相对于常规角度的结果,其中零沿 +X 轴,+pi/2 沿 +Y 轴,所以你必须转换成航向角。

于 2011-03-27T00:12:51.547 回答
0

大多数语言都有一个 atan2 函数,它将直接将 x,y 增量转换为弧度角。将其转换为度数取决于您。

于 2011-03-27T00:13:18.830 回答