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 的评论,除以一半下降)。
所以我正在根据输入的度数计算我在 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 的评论,除以一半下降)。