java 是第二个角的左边或右边的角

eeq64g8w  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(117)

我需要知道另一个角是在源角的右边还是左边。
我试着减去这些Angular ,得到它们的绝对值,但是范围是从-180到180,这意味着当我到180,再到-180,它会给予我相反的答案。
如果你想知道这是什么,是一个Java游戏,我正在开发的地方有一个坦克炮塔由鼠标控制。

fhity93d

fhity93d1#

这取决于你的Angular 是指定顺时针方向还是逆时针方向的旋转。如果你看的是坦克炮塔的方向,那么如果你需要顺时针旋转炮塔以尽可能快地指向它,那么对象就在右边,如果你需要逆时针旋转,那么对象就在左边。
显然,你可以向相反的方向旋转,以“绕很远的路”:如果一个物体向右10度,那么你可以顺时针旋转10度或逆时针旋转350度来指向它。但是让我们只考虑一下短的方式,假设Angular 是在顺时针方向指定的:

// returns 1 if otherAngle is to the right of sourceAngle,
//         0 if the angles are identical
//         -1 if otherAngle is to the left of sourceAngle
int compareAngles(float sourceAngle, float otherAngle)
{
    // sourceAngle and otherAngle should be in the range -180 to 180
    float difference = otherAngle - sourceAngle;

    if(difference < -180.0f)
        difference += 360.0f;
    if(difference > 180.0f)
        difference -= 360.0f;

    if(difference > 0.0f)
        return 1;
    if(difference < 0.0f)
        return -1;

    return 0;
}

减去Angular 后,结果可以在-360(-180减去180)到360(180减去-180)的范围内。您可以通过添加或减去360度将它们带入-180到180的范围内,然后与零比较并返回结果。
绝对值在180 °和360 °之间的Angular 对应于“长距离”旋转,加上或减去360 °将它们转换为“短距离”。例如,长距离顺时针旋转-350度(即逆时针旋转350度)加上360 °等于短距离顺时针旋转10度。
如果按逆时针方向指定Angular ,则返回值的含义相反(1表示向左,-1表示向右)

tvmytwxo

tvmytwxo2#

我正在回顾我以前的一个项目,发现了一些有趣的东西,我认为它可能对这个或其他情况有用。它是一个表达式,可以取任意两个Angular ,并输出Angular 差和方向,范围为-179到180。(((B-A+180)%360-360)%360+180)

// returns =0 if the Angles are Identical,
//         <0 if TargetAngle is to the left of SourceAngle,
//         >0 if TargetAngle is to the right of SourceAngle.
// if AngleToAngle == 180, then they are Parallel Angles.
// SourceAngle and TargetAngle can be any Angle.

function AngleToAngle(SourceAngle, TargetAngle) {
return (((TargetAngle-SourceAngle+180)%360-360)%360+180);

//multiply by -1 to flip left and right such as
//return -1*(((TargetAngle-SourceAngle+180)%360-360)%360+180);
}

下面列出一些例子:

AngleToAngle(20,60) = 40
AngleToAngle(90,0) = -90
AngleToAngle(-90,350) = 80
AngleToAngle(45,270) = -135
AngleToAngle(145,525) = 20

更新:
要在Python和Ruby等引擎中使用此表达式,其中Modulo定义已更改,请修改表达式并将Range设置为从-180到179。上面的代码更新如下。(((B-A+180)%360-360)%360-180)

// returns =0 if the Angles are Identical,
//         <0 if TargetAngle is to the left of SourceAngle,
//         >0 if TargetAngle is to the right of SourceAngle.
// if AngleToAngle == -180, then they are Parallel Angles.
// SourceAngle and TargetAngle can be any Angle.

function AngleToAngle(SourceAngle, TargetAngle) {
return (((TargetAngle-SourceAngle+180)%360-360)%360-180);

//multiply by -1 to flip left and right such as
//return -1*(((TargetAngle-SourceAngle+180)%360-360)%360-180);
}

相关问题