簡體   English   中英

24小時范圍交叉邏輯

[英]24 hour ranges intersection logic

我的時間表可以從21:00到04:00。
通常,這些時間表可能會超過00:00小時。
現在我還必須添加從00:00到23:59的正常時間表。
我想為它計算一個交集。
目前我正在使用

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

當考慮到跨日行程時,我仍然沒有有效的防錯邏輯,請幫忙。

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 - e1 ,將e1轉換為unsigned int以匹配s0 ,將s0 - e0轉換為unsigned int以匹配(unsigned int) s0 - e1 下面,我假設所有算術都是無符號的。

回想起來,我希望我以相反的順序寫這些術語。 讓我們現在修復它。 s0 - e0 <= s0 - e1等效於e0 - s0 >= e1 - s0 (即使在無符號算術中也是如此。)現在我們可以將e0 - s0e1 - s0視為將e0e1轉換為以s0為原點的參考幀的時間。 在此框架中,每天中比原始s0早的任何時間都被包裝為大正數。 因此,午夜時分的包裹不見了。 s0開始只有非負時間。 然后我們看到e0 - s0 >= e1 - s0在問“從s0測得的e1是否小於或等於e0 ?”的問題等同於“在[ s0e0 ]內的e1是嗎?”

因此,這兩個條件詢問“[S0,E0]E1或為[S1,E1]的e0?”如果任一間隔在另一個之內結束,則間隔重疊。 如果兩端都在另一端,則它們不會重疊。

按順序考慮第一個時間間隔中的每個時刻。 如果這些時刻都與第二個間隔的開始不重合,則這兩個間隔不會相交,除非這些間隔已經與開始相交,在這種情況下,第一個間隔中的第一個瞬時將沿着第二個間隔以類似的方式發生間隔。 因此,如果第一個間隔的開始和結束是(l1,r1),第二個間隔的開始和結束是(l2,r2),我們可以通過查看是否在范圍[l2,r2]中包括l1以及是否包括l2來進行檢查在[l1,r1]范圍內。 如果lx在數值上不大於rx,則這是簡單的檢查,看是否(l1> = l2)&&(l1 <= r2)。 如果lx大於rx,則它是一個環繞間隔,您可以檢查(l2> = l1)|| (l2 <= r1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM