Граница = запись
Тип : Включается/Невключается;
Значение : Двойной_точности;
конец Граница.
Отрезок = запись
Мин : Граница;
Макс : Граница;
конец Отрезок.
А,Б : Отрезок;
Алгоритм поиска пересечений интервалос
Т.е может быть и
[-3,5)*(1,9]
и
что угодно в этом роде.
Парсер сделал. Теперь вопрос.
Как имея данные о граничных числах (значение и вхождение в интервал) можно определить пересечение?
Почти как с отрезками но +/-@(бесконечность) и включительные границы мешают
Код:
Соответственно, в поле "значение" может быть значение "infinity" и "neginfinity" (для паскаля такие). Получается, теперь надо из отрезка А вычесть все, что не входит в отрезок Б.
Дальше алгоритм примерно такой:
Код:
Если А.Мин.Значение = neginfinity Тогда
Если (А.Макс.Значение > Б.Мин.Значение) Тогда
С.Мин.Значение = Б.Мин.Значение
Иначе
Если А.Макс.Значение=Б.Мин.Значение и А.Макс.Тип=Включается и Б.Мин.Тип=Включается Тогда
C.Мин.Значение = А.Макс.Значение
С.Макс.Значение = А.Макс.Значение
Иначе
Нет пересечения
КонецЕсли
КонецЕсли
Иначе
....
Если (А.Макс.Значение > Б.Мин.Значение) Тогда
С.Мин.Значение = Б.Мин.Значение
Иначе
Если А.Макс.Значение=Б.Мин.Значение и А.Макс.Тип=Включается и Б.Мин.Тип=Включается Тогда
C.Мин.Значение = А.Макс.Значение
С.Макс.Значение = А.Макс.Значение
Иначе
Нет пересечения
КонецЕсли
КонецЕсли
Иначе
....
Дальше - сам. Как-то так...
З.Ы.: Советую - когда закончишь с левой границей мысленно переверни ось и проделай тоже самое с правой.
+1, MaitreDesir