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