Javascript 获得360度的角度

Javascript 获得360度的角度,javascript,geometry,angle,Javascript,Geometry,Angle,我想得到一个360度的角度。。。对于我的游戏,我需要知道玩家的方向 这里的代码得到了正确的角度,但只以90度的增量表示:(意思是,当我点击左上象限时,我得到的角度是0到90度……左下角是0到-90度,等等。) 我怎样才能得到360度的角度 下面是另一个例子:前两个代表问题。。。当我点击左上/左下象限时,它会一直从x轴绘制一个直角三角形 我需要它像下面的两张图片一样,不断画出周围的角度: 您需要使用比Arcin多一点的信息来解决这个问题。原因是,正如您已经知道的,arcsin只返回介于-π/

我想得到一个360度的角度。。。对于我的游戏,我需要知道玩家的方向

这里的代码得到了正确的角度,但只以90度的增量表示:(意思是,当我点击左上象限时,我得到的角度是0到90度……左下角是0到-90度,等等。)

我怎样才能得到360度的角度


下面是另一个例子:前两个代表问题。。。当我点击左上/左下象限时,它会一直从x轴绘制一个直角三角形

我需要它像下面的两张图片一样,不断画出周围的角度:


您需要使用比Arcin多一点的信息来解决这个问题。原因是,正如您已经知道的,arcsin只返回介于-π/2和π/2(-90度和90度)之间的值

所以,要想知道另一部分,你需要知道你在哪个象限

在象限2中,弧心在90和0之间,实际角度在90和180之间。所以如果你在象限2,180-
计算角度
=
实际角度
<代码>(180-90=90,180-0=180)

在象限3中,arcsin介于0和-90之间。实际角度在180和270之间。同样,180-
计算角度
=
实际角度
<代码>(180-0=180,180-(-90)=270)

在象限4中,arcsin介于-90和0之间。实际角度在270和360之间。所以360+
计算角度
=
实际角度
<代码>(360+(-90)=270,360+0)=360)

象限1也是如此,您不需要进行转换。(
0+360=360(相当于0),90+360=450(相当于90))

因此,首先确定象限,并在此基础上应用规则。 对于(x,y)坐标,如果x为正,y为正,则为象限1。如果x为负,y为正,则为象限2。如果x为负,y为负,则为象限3。如果x为正,y为负,则为象限4

在你的例子中,到原点的距离是你的坐标对,像这样的东西应该可以做到:

//your original code...
var degrees = radians*(180/Math.PI);    //convert from radians to degrees

//then


if (dX>=0 and dY>=0)
{//quadrant 1
//no transformation, do nothing
}
if (dX>=0 and dy<0) 
{ //quadrant 4
degrees=360+degrees;
}
if (dX<0 and dy<0) 
{ //quadrant 3
degrees=180-degrees;
}
if (dX<0 and dy>0) 
{ //quadrant 2
degrees=180-degrees;
}


this.calculatedAngle = degrees;
//您的原始代码。。。
var度=弧度*(180/数学π)//从弧度转换为度
//然后
如果(dX>=0和dY>=0)
{//象限1
//不改造,什么也不做
}
如果(dX>=0且dy尝试以下操作:

var dY=this.pos.y-e.gameY,//相反
dX=this.pos.x-e.gameX,//相邻
弧度=Math.atan(dY/dX);//错误,单位为[-1/2π,1/2π]
如果(1/dX<0)弧度+=Math.PI;//固定,在[-1/2pi,3/2pi]
如果(1/弧度<0)弧度+=2*Math.PI;//固定,单位为[+0,2 PI]
var degrees=弧度*180/Math.PI;//从弧度到度
说明:

  • 最好使用
    Math.atan
    和切线计算弧度。使用
    Math.sqrt
    计算斜边的成本很高
  • Math.atan
    给出了
    -1/2π
    1/2π
    之间的一个角度,即右半圆。若
    dX
    为负,只需求和
    pi
  • 然后我们得到
    -1/2π
    3/2π
    之间的角度。因此,如果是负值,我们求和
    ,以获得
    0
    之间的角度
  • 注意,我们必须考虑<代码> -0 < /代码>以使其正常工作。因此,我们不检查<代码> dx < 0 < /C>和<代码>弧度> 0 < /代码>,检查它们的倒数。
  • 注:如果
    dX
    dY
    均为
    0
    (或
    -0
    ),则最终结果将为
    NaN

    • 通过使用该函数,您可以直接从坐标中执行此操作,而无需计算斜边等额外信息,该函数在FORTRAN早期设计用于与您完全相同的情况

      请注意两件重要的事情:

    • 已创建
      atan2
      功能,以自动处理许多可能情况中除一个以外的所有情况,以及
    • 它将输出
      (-PI,PI]
      的范围
    • 两个坐标都是(0,0)的情况是未定义的(当向量的大小为零时,所有角度都是等效的),所以在这种情况下,我任意将角度设置为零度。为了获得所需的范围,需要一些简单的逻辑和加法

      var Vx = this.pos.x - e.gameX;
      var Vy = this.pos.y - e.gameY;
      
      var radians;
      
      if (Vx || Vy) {
          radians = Math.atan2(Vy, Vx);
      } else {
          radians = 0;
      }
      
      if (radians < 0) {
          radians += 2*Math.PI;
      }
      
      var degrees = radians * 180 / Math.PI;
      
      this.calculatedAngle = degrees;
      
      var Vx=this.pos.x-e.gameX;
      var Vy=这个位置y-e.gameY;
      弧度;
      if(Vx | | Vy){
      弧度=数学常数2(Vy,Vx);
      }否则{
      弧度=0;
      }
      if(弧度<0){
      弧度+=2*Math.PI;
      }
      var度=弧度*180/Math.PI;
      此。计算角度=度;
      
      结果将为所有情况定义一个角度,并在[0,360°]范围内,如需要

      例子
      函数显示度(e、svg){
      var rectangle=svg.getBoundingClientRect();
      var targetX=(rectangle.left+rectangle.right)/2;
      var targetY=(rectangle.top+rectangle.bottom)/2;
      var Vx=数学圆(e.clientX-targetX);
      var Vy=数学圆(targetY-e.clientY);
      var弧度=数学atan2(Vy,Vx);
      如果(弧度<0)弧度+=2*Math.PI;
      变量度=数学圆(弧度*180/数学圆周率);
      var textBox=document.getElementById('showdegrees');
      textBox.innerHTML=degrees+'°;'+'('+Vx+','+Vy+');
      textBox.setAttribute('x',Math.round(100+Vx));
      setAttribute('y',Math.round(100-Vy));
      }
      
      信息
      
      您是否有任何数据可以用来证明您在所有4个象限中的计算?您可以使用符号
      dy
      dx
      来区分象限,并相应地在结果中添加偏移量。@Xotic750您的意思是什么?我只需取用户单击的地图上的点(e.gameX或e.gameY)并获取到玩家当前位置的距离。橙色
      var Vx = this.pos.x - e.gameX;
      var Vy = this.pos.y - e.gameY;
      
      var radians;
      
      if (Vx || Vy) {
          radians = Math.atan2(Vy, Vx);
      } else {
          radians = 0;
      }
      
      if (radians < 0) {
          radians += 2*Math.PI;
      }
      
      var degrees = radians * 180 / Math.PI;
      
      this.calculatedAngle = degrees;