1

21:00から04:00まで行けるスケジュールがあります。
ほとんどの場合、これらのスケジュールは 00:00 時間のマークを通過する可能性があります。
ここで、00:00 から 23:59 までの通常のスケジュールも追加する必要があります。
同じ交点を計算したいと思います。
現在私は使用しています

if(((mytime1.start_time <= mytime2.end_time) && (mytime2.start_time <= mytime1.end_time))).

トランスデイスケジュールが考慮されている場合、交差点の有効なフールプルーフロジックはまだありません。助けてください。

4

2 に答える 2

1
bool DoIntervalsOverlap(int s0, int e0, int s1, int e1)
{
    return s0 - e0 <= (unsigned int) s0 - e1 || s1 - e1 <= (unsigned int) s1 - e0;
}

まず、本質的に、すべての演算は符号なしであることに注意してください。ではs0 - e0 <= (unsigned int) s0 - e1e1unsigned intmatchs0に変換され、 はmatchにs0 - e0変換されます。以下では、すべての演算が符号なしであると仮定します。unsigned int(unsigned int) s0 - e1

振り返ってみると、用語を逆の順序で書いておけばよかったと思います。今すぐ修正しましょう。s0 - e0 <= s0 - e1と同等e0 - s0 >= e1 - s0です。e0 - s0(これは、符号なし算術演算でも当てはまります。) ここで、 andを、 s0が原点にある参照フレームに変換さe1 - s0れた時間e0e1と考えることができます。このフレームでは、元のs0よりも前の時間はすべて、大きな正の数にラップされています。そのため、深夜のラッピングはなくなりました。s0から測定された非負の時間のみがあります。次に、それが「 e1は、 s0から測定して、 e0以下かどうか」を尋ねていることがわかります。e0 - s0 >= e1 - s0?」その質問は、「 e1は [ s0 , e0 ] 内にありますか?」と同等です。</p>

したがって、2 つの条件は、「e1は [ s0 , e0 ] 内にあるか、またはe0は [ s1 , e1 ] 内にあるか?」と尋ねます。いずれかの間隔が他方の内側で終了する場合、間隔は重複します。どちらも他方の内側で終わらない場合、それらは重なりません。

于 2013-08-31T15:45:41.200 に答える