[ОТВЕТИТЬ]
Опции темы
04.03.2015 18:03  
OlegON
Итак, есть временные отрезки
beg-end
std-etd
на 24-часовом циферблате. Могут быть любой длины, в т.ч. нулевой и больше суток, даты нет, только часы.
Какой правильный и красивый алгоритм определения, что отрезки пересекаются?
Сделал просто
Код:
((beg>=std && beg<etd)||(end>=std && end<=etd))
все ли учел? Только, плз, не надо кучи ссылок, я уже себе мозг вырвал чтением разных вариантов, большинство из них с учетом календаря, а мне не надо это, либо совпадают с моим, но у меня нет в нем уверенности..
 
04.03.2015 18:15  
KirillHome
Цитата:
Сообщение от OlegON
Итак, есть временные отрезки
beg-end
std-etd
на 24-часовом циферблате. Могут быть любой длины, в т.ч. нулевой и больше суток, даты нет, только часы.
Какой правильный и красивый алгоритм определения, что отрезки пересекаются?
Сделал просто
Код:
((beg>=std && beg<etd)||(end>=std && end<=etd))
все ли учел? Только, плз, не надо кучи ссылок, я уже себе мозг вырвал чтением разных вариантов, большинство из них с учетом календаря, а мне не надо это, либо совпадают с моим, но у меня нет в нем уверенности..
Равняется не забыл?
Код:
((beg>=std && beg<=etd)||(end>=std && end<=etd))
 
04.03.2015 19:46  
vdm
"Пересекаются" как. А то есть вариант когда второй отрезок меньше первого и полностью внутри него.
 
"Спасибо" vdm от:
04.03.2015 21:57  
OlegON
Равняется не забыл, специально исключил, да... т.е. beg может быть в момент std, это не пересечение...

Вот про второй меньше первого это ппц... Упустил... Только тогда как условия писать не понимаю, сравнивать

Код:
((beg>=std && beg<=etd)||(end>=std && end<=etd))||((std>=beg && std<=end)||(etd>=beg && etd<=end))
?
 
04.03.2015 22:32  
Micle
в поставленной задаче можно выделить 4 случая пересечения. а именно:

Код:
1.
   --------
        ----------

2.
        ----------
   --------

3.
   ---------------
        -----

4.
        -----
   ---------------
всё остальное - частные случаи одного из перечисленных, попадающие под условия <= >=

равенство исключать нельзя на мой взгляд.

т.о. в последнем варианте уже что то похожее на правильную реализацию просматривается. Честно, не разглядывал подробно что именно с чем сравнивается.
 
04.03.2015 23:56  
KirillHome
Цитата:
Сообщение от Micle
в поставленной задаче можно выделить 4 случая пересечения. а именно:

Код:
1.
   A--------B
        C----------D

2.
        A----------B
   C--------D

3.
   A---------------B
        C-----D

4.
       A -----B
   C---------------D
....
На мой взгляд, случаев два
Код:
1.
   A--------B
        C----------D

2.
        A----------B
   C--------D

3.
   A---------------B
        C-----D

4.
       A -----B
   C---------------D
1. A <= C и B => C
2. C <= A и D => A
3. аналогично первому
4. аналогично второму.
 
05.03.2015 07:28  
OlegON
Я без рисунков, просто исходя из определения, что если отрезки пересекаются наложением, то либо хвост одного принадлежит второму, либо начало. Соответственно, для случаев, когда один отрезок полностью включает второй, приходится проверять все четыре хвоста. Мне кажется, что из этого правила уже исключений не будет.
 
05.03.2015 09:30  
vdm
А еще вопрос - возможна такая запись диапазона: 22:00-02:00?
 
05.03.2015 09:34  
OlegON
Цитата:
Сообщение от vdm
А еще вопрос - возможна такая запись диапазона: 22:00-02:00?
Именно, только про 22-02 речь. И 22-21 может быть.
 
05.03.2015 11:56  
vdm
1. 22:00-21:00
2. 10:00-12:00

Пересечение есть, но в таком виде условия не сработают.
 
 


Опции темы



Часовой пояс GMT +3, время: 03:19.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.