2011-11-03 4 views
-1

私は2つの経度があります。経度Aは常にLongitude Bの西でなければなりません。両方とも-180と180の間の有効な値が与えられているとすれば、C#を使用してAが西からBであるかどうかを調べる検証ルーチンを作成できますか? Aは決してBと同じではない?元子午線のものと180/-180ティンは私に混乱を招く。私は後方か何かじゃないと仮定すると、2経度C#検証

おかげ

マット

+1

カンザスで始まり、十分に西に行くと、ミズーリで終わるでしょう。 –

+1

技術的にAは、Bの西側にあるかどうかを問わない限り、常にBの西側と見なすことができます。 –

+0

何かが何かから西にあるとどう定義しますか?あなたがフランスから西に行くと、結局あなたはドイツに行きます。それは、ドイツがあなたのためにフランスの西側にあるということですか?それとも、あなたはいつもより短いルートをとっていますか? – svick

答えて

2

海のナビゲーションで経度differenseが負の場合、最初の経度は、それ以上のものとして考えられています西。しかし、differenseの絶対値が180より大きい場合、値は360からデクリメントされ、符号はネゲートされます。したがって、

bool IsMoreWest(double longitudeA, double logitudeB) 
{ 
    double difference = longitudeA - logitudeB; 
    if (Math.Abs(difference) > 180.0) { 
     difference = -Math.Sign(difference) * (360.0 - Math.Abs(difference)); 
    } 
    return difference < 0; 
} 
+0

私はこの答えが好きだと思いますが、私はもっと具体的なことができました。だからlongitudeAは、2つの権利の西経座標を提案したものとして使用できますか?私がこれを正しく理解していると仮定すると、アリューシャン島に関する情報を使ってテストしています。東半球では170、東半球では-155である。 (170-155)= 325である。 325> 180 =真となる。 (-1)*(35)= - 34。真を返します。私はこれを正しく理解しましたか? –

+0

もし私が間違ったデータを試そうとした場合、longA = -155とlongB = 170です。 (-155-170)= - 325。 325> 180 =真となる。 1 * 685. falseを返します。 –

+1

あなたの計算はほぼ正しいと思われます。私はちょっとした修正をしたいだけです:最初のケースでは結果は-35(-34ではない)です。これは乗算であるからです。絶対値が減算されているため、2番目のケースでは結果は35(685ではなく)です。 – Eugene

1
//minutes and seconds to right of . for simplicity 
public void Validate(Decimal dLongitudeA, Decimal dLongitudeB) 
{ 
    if((dLongitudeB + 360 - dLongitudeA) % 360 < 180) 
     throw new ApplicationException("Validation Failed."); 
} 

...

+1

「Decimal」が私にとって「Double」よりも良い状況のようには見えません。 – CodesInChaos