我需要在角度/幅度和水平/垂直分量之间进行转换。
这些公式最接近有效,但有些毛病:
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速度。
这些公式还存在其他问题,但它们是我所拥有的最好的。请不要向我指出其他任何问题/答案;我向你保证,如果它存在于互联网上,我已经尝试过了,但发现它也不起作用。在过去的三天里,我已经建立了相当多的向量函数集合,应该可以满足我的需要,但没有任何作用。
答案 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;
}