Столкнулся с задачей:
есть N (1<=N<=99) полуплоскостей, задаваемых следующим образом: Ai * X + Bi * Y + Ci < 0 (все коэффициенты вещественные) Необходимо определить, пустое ли пересечение этих полуплоскостей, или нет.
Не могу себе представить, как реализовать такое покороче.. без лишних проблем.. Ведь получаемое множество может быть и бесконечным.
какой правильный подход к таким задачам, позволяющий допустить поменьше ошибок?
А есть полное условие?
Да, есть:
http://acm.timus.ru/problem.aspx?space=1&num=1062
решается через двойственность выпуклой оболочке
Красавчик! Спасибо!!
А может у тебя есть и ссылка на реализацию? А то вот пункт из статьи про "пересечь 2 цепочки" не кажется тривиальным =))
Нет, реализацией этого, к сожалению, пока не баловался. Когда писал этот конспект, мне казалось, что там достаточно очевидный сканлайн слева направо.
Кажется, сначала стоит рассмотреть простое решение через точки пересечения в даблах соседних полуплоскостей в цепочках, а потом предикаты в даблах заменить на предикаты в интах выкладками, похожими на выкладки в конспекте.
Ведь если у тебя есть точки пересечения — все просто, достаточно найти два места, в которых p1[i].y ≥ p2[j].y && p1[i + 1].y ≤ p2[j + 1].y. А тут уже два указателя. Надо еще аккуратно все это инициализировать конечно, или сразу как-то перейти к полуплоскостям.
А еще можно взять решение задачи "пересечение выпуклых многоугольников" и выкинуть почти все :)
Думаю именно тут можно перебрать все пары прямых, найти все пересечения,выбрать те, которые удовлетворяют неравенствам( ≤ )и либо оболочку построить либо каким либо ещё способом проверить чтоб площадь между ними != 0. А и не забыть добавить 3-4 фиктивных прямых, которые ограничивают всю область.