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 - s0
и e1 - s0
как раз e0 и e1 переведен в систему отсчет, в которой s0 находится в начале координат. В этом фрейме в любое время, которое было ранее в день, чем оригинал s0, были перенесены на большие положительные числа. Итак, обертывание около полуночи пропало. Мы имеем только неотрицательное время, измеренное от s0. Тогда мы видим, что e0 - s0 >= e1 - s0
спрашивает «Является ли e1, измеренная от s0, меньше или равно e0?» Этот вопрос эквивалентен «Является ли e1 внутри [s0, e0]? »
Таким образом, эти два условия спросить:«является ли e1 внутри [s0, e0] или e0 внутри [s1, e1]? "Если каждый интервал заканчивается внутри другого, интервалы перекрываются. Если ни один из них не кончается внутри другого, они не перекрываются.
Просьба привести пример того, что вы хотите делать с интервалами. – Aravind
Не должно быть двух перекрывающихся интервалов: «Два интервала с 21:00 до 04:00 и с 08:00 до 10:00» должны отображаться как не пересекающиеся, в то время как любой из «20:00 до 22:00 или 03:00» 05: 00' или даже полностью перекрываемое расписание должно показать конфликт. Короче, не должно быть никаких пересекающихся диапазонов. –
Перед тем, как сравнивать, просто добавьте 24 в 'mytime2.start_time' и' mytime1.end_time', если их значение меньше 12. Это будет работать до тех пор, пока каждое расписание ** никогда ** больше 24 часов. – TheCodeArtist