Блог пользователя sergw

Автор sergw, история, 8 лет назад, По-русски

Столкнулся с задачей:

есть N (1<=N<=99) полуплоскостей, задаваемых следующим образом: Ai * X + Bi * Y + Ci < 0    (все коэффициенты вещественные)
Необходимо определить, пустое ли пересечение этих полуплоскостей, или нет.

Не могу себе представить, как реализовать такое покороче.. без лишних проблем.. Ведь получаемое множество может быть и бесконечным.

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

какой правильный подход к таким задачам, позволяющий допустить поменьше ошибок?

»
8 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Красавчик! Спасибо!!

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    А может у тебя есть и ссылка на реализацию? А то вот пункт из статьи про "пересечь 2 цепочки" не кажется тривиальным =))

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Нет, реализацией этого, к сожалению, пока не баловался. Когда писал этот конспект, мне казалось, что там достаточно очевидный сканлайн слева направо.
      Кажется, сначала стоит рассмотреть простое решение через точки пересечения в даблах соседних полуплоскостей в цепочках, а потом предикаты в даблах заменить на предикаты в интах выкладками, похожими на выкладки в конспекте.
      Ведь если у тебя есть точки пересечения  —  все просто, достаточно найти два места, в которых p1[i].y ≥ p2[j].y && p1[i + 1].y ≤ p2[j + 1].y. А тут уже два указателя. Надо еще аккуратно все это инициализировать конечно, или сразу как-то перейти к полуплоскостям.
      А еще можно взять решение задачи "пересечение выпуклых многоугольников" и выкинуть почти все :)

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Думаю именно тут можно перебрать все пары прямых, найти все пересечения,выбрать те, которые удовлетворяют неравенствам( ≤ )и либо оболочку построить либо каким либо ещё способом проверить чтоб площадь между ними != 0. А и не забыть добавить 3-4 фиктивных прямых, которые ограничивают всю область.