如何将角度和大小转换为水平和垂直分量?

时间:2019-05-22 04:30:30

标签: javascript

我需要在角度/幅度和水平/垂直分量之间进行转换。

这些公式最接近有效,但有些毛病:

function velocityToSpeeds(direction, speed) {
  return {
    hspeed: -speed*Math.sin(Math.toRad(direction) - 90) + 0, 
    vspeed: -speed*Math.cos(Math.toRad(direction) - 90) + 0
  };
}

function velocityToSpeedsALTERNATIVE(direction, speed) {
  return {
    x: speed*Math.cos(Math.toRad(direction)), 
    y: speed*Math.sin(Math.toRad(direction))
  };
}

function speedsToVelocity(hspeed, vspeed) {
  return {
    direction: Math.round(Math.toDeg(Math.atan2(vspeed, hspeed))) + 0,
    speed: Math.round(Math.sqrt(hspeed * hspeed + vspeed * vspeed)) + 0
  }
}`

+0将阻止函数返回-0

我正在使用屏幕坐标;例如(0,0)在左上方。另外,右侧为0度,向下为270度。因此,如果我将水平速度(hspeed)和垂直速度(vspeed)分别转换为角度和幅度,则将水平速度(hspeed)设置为0,将角度和幅度分别设置为0度(方向)和幅度(速度)。

speedsToVelocity(1, 0)正常工作。

但是speedsToVelocity(0, 1)返回90度,当角度应为270度时返回1速度。

这些公式还存在其他问题,但它们是我所拥有的最好的。请不要向我指出其他任何问题/答案;我向你保证,如果它存在于互联网上,我已经尝试过了,但发现它也不起作用。在过去的三天里,我已经建立了相当多的向量函数集合,应该可以满足我的需要,但没有任何作用。

1 个答案:

答案 0 :(得分:0)

我终于让它可以进行以下修改:

function velocityToSpeeds(direction, speed) {
  return {
    hspeed: Number(-Number(speed)*Math.sin(Math.toRad(Number(direction) - 90))) + 0, 
    vspeed: Number(-Number(speed)*Math.cos(Math.toRad(Number(direction) - 90))) + 0
  };
}

function speedsToVelocity(hspeed, vspeed) {
  return {
    direction: Math.round(Number(Math.toDeg(Math.atan2(Number(vspeed), Number(hspeed))))) + 0,
    speed: Math.round(Number(Math.sqrt(Number(hspeed) * Number(hspeed) + Number(vspeed) * Number(vspeed)))) + 0
  }
}

还有一些额外的奖励:

function negativeHspeed(direction) {
  return ((180 - direction) + 360) % 360;
}

function negativeVspeed(direction) {
    return 360 - direction;
}