360 度角的轴承范围问题

Bearing range issue for 360 degree angles

所以我正在根据输入的度数计算我在 gui 上的方位,一切正常。除了现在我正在尝试显示传入方位周围的视图范围。

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

因此,在 0 时,我的最小视野范围变为 "down" 到 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)

我该如何补偿?

计算相对于当前视图 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 的评论,除以一半下降)。