2017-10-23 17 views
-1

私は軸受のベアリングを受信度に基づいて計算しています。それ以外は、その軸受けの周囲に視界範囲を表示しようとしています。360度のベアリングの範囲の問題

たとえば、入ってくる方位は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は、ベアリングが16になったらので、その後(0 32)

どのようにすることができ、その後、私の範囲が正しく再び色の取得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のコメントに従って、半分に分けて除算します)。

+0

天才ありがとうございます。私の実装では、viewRangeを半分に分割する必要はありませんでした。それを現在の値のままにすると、必要な結果が得られました。 – bauervision

+0

@bauervision最後の更新を参照してください。 – CiaPan

関連する問題