2013-08-31 3 views
1

У меня есть графики, которые могут идти с 21:00 до 04:00.
В основном эти графики будут таковы, что они могут пройти отметку 00:00 часов.
Теперь я также должен добавить обычные графики, начиная с 00:00 до 23:59.
Я хотел бы рассчитать пересечение для того же самого.
В настоящее время я использую24-часовая дальность пересечения логики

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

Я до сих пор не имею действительную глупое доказательство логики для пересечения, когда транс графики дня принимается во внимание, пожалуйста, помогите.

+1

Просьба привести пример того, что вы хотите делать с интервалами. – Aravind

+0

Не должно быть двух перекрывающихся интервалов: «Два интервала с 21:00 до 04:00 и с 08:00 до 10:00» должны отображаться как не пересекающиеся, в то время как любой из «20:00 до 22:00 или 03:00» 05: 00' или даже полностью перекрываемое расписание должно показать конфликт. Короче, не должно быть никаких пересекающихся диапазонов. –

+0

Перед тем, как сравнивать, просто добавьте 24 в 'mytime2.start_time' и' mytime1.end_time', если их значение меньше 12. Это будет работать до тех пор, пока каждое расписание ** никогда ** больше 24 часов. – TheCodeArtist

ответ

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 - 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]? "Если каждый интервал заканчивается внутри другого, интервалы перекрываются. Если ни один из них не кончается внутри другого, они не перекрываются.

+0

Элегантный по своей простоте ... – TheCodeArtist

+0

'bool' - это тип C++. Этот вопрос отмечен 'C'. – anthropomorphic

+1

@anthropomorphic: 'bool' находится в C 1999 и позже, когда включен' ''. –

0

Учитывайте каждый момент времени в первом интервале по порядку. Если ни один из этих моментов не совпадает с началом второго интервала, то два интервала не пересекаются, если только интервалы не пересекаются с самого начала, и в этом случае первый момент в первом интервале будет происходить в аналогичном проходе по второму интервал. Поэтому, если начальные и конечные значения (l1, r1) для первого интервала и (l2, r2) для второго, мы можем проверить, посмотрев, включен ли l1 в диапазон [l2, r2], и если l2 включен в диапазоне [l1, r1]. Если lx численно не больше rx, то это простая проверка, чтобы увидеть, например, (l1> = l2) & & (l1 < = r2). Если lx больше rx, то это промежуток времени, и вы можете проверить, (l2> = l1) || (l2 < = r1).

Смежные вопросы