// 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;
}
// 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);
}
// 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);
}
2条答案
按热度按时间fhity93d1#
这取决于你的Angular 是指定顺时针方向还是逆时针方向的旋转。如果你看的是坦克炮塔的方向,那么如果你需要顺时针旋转炮塔以尽可能快地指向它,那么对象就在右边,如果你需要逆时针旋转,那么对象就在左边。
显然,你可以向相反的方向旋转,以“绕很远的路”:如果一个物体向右10度,那么你可以顺时针旋转10度或逆时针旋转350度来指向它。但是让我们只考虑一下短的方式,假设Angular 是在顺时针方向指定的:
减去Angular 后,结果可以在-360(-180减去180)到360(180减去-180)的范围内。您可以通过添加或减去360度将它们带入-180到180的范围内,然后与零比较并返回结果。
绝对值在180 °和360 °之间的Angular 对应于“长距离”旋转,加上或减去360 °将它们转换为“短距离”。例如,长距离顺时针旋转-350度(即逆时针旋转350度)加上360 °等于短距离顺时针旋转10度。
如果按逆时针方向指定Angular ,则返回值的含义相反(1表示向左,-1表示向右)
tvmytwxo2#
我正在回顾我以前的一个项目,发现了一些有趣的东西,我认为它可能对这个或其他情况有用。它是一个表达式,可以取任意两个Angular ,并输出Angular 差和方向,范围为-179到180。
(((B-A+180)%360-360)%360+180)
下面列出一些例子:
更新:
要在Python和Ruby等引擎中使用此表达式,其中Modulo定义已更改,请修改表达式并将Range设置为从-180到179。上面的代码更新如下。
(((B-A+180)%360-360)%360-180)