360度角的轴承范围问题

时间:2017-10-23 14:01:10

标签: degrees

所以我根据进入的学位计算我的轴承,一切正常。除了现在我试图显示围绕该传入轴承的视野范围。

例如,进入的方位是0度,我的+/-视角半径是16度。

因此,在0时,我的最小视野范围变为"向下"到344,我的最大值达到16。

每个学位我都有一个QGraphicsLineItem,我根据它在这个范围内的位置着色;它具有与当前放置位置相关联的角度角度。因此,如果该项目不在当前范围内,则为红色,如果该项目为蓝色。

我的问题在于试图找出要检查的逻辑条件。

目前我有:

if(item.degrees <= minViewRange && item.degrees <= bearing )
    item.colorBlue = true;
else if (item.degrees >= bearing && item.degrees <= maxViewRange)
    item.colorBlue = true;
else
    item.colorBlue = false;

所有这一切都可以正常工作,直到我达到零度16度。

因此,例如,在0的方位,只有(0 - 16)条件为真,所以只有那一半被着色。 (344 - 0)不是真的,因为344不小于0.

一旦轴承变为16,那么我的范围再次正确着色,因为那时(0 <16 <32)

我该如何弥补这个?

1 个答案:

答案 0 :(得分:1)

计算相对于当前视图的bearing的方向,并将它们标准化为(-180,+ 180)范围。然后比较半视图的宽度:

relativeBearing = item.degrees - bearing;

while (relativeBearing > 180)
    relativeBearing -= 360;
while (relativeBearing < -180)
    relativeBearing += 360;

if (relativeBearing >= -viewRange/2 && relativeBearing <= viewRange/2)
    item.colorBlue = true;
else
    item.colorBlue = false;

或者,用abs()函数来计算绝对值:

if (abs(relativeBearing) <= viewRange/2)
    item.colorBlue = true;
else
    item.colorBlue = false;

<强>更新

更短,直接使用boolean比较结果:

item.colorBlue = abs(relativeBearing) <= viewRange;

(根据OP的评论,将其除以一半)。