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

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

Здравствуйте, помогите с такой задачей пожалуйста.

Нам дан многоугольник и точка, нужно проверить принадлежит ли точка многоугольнику. Многоугольник может быть как выпуклый, так и не выпуклый. Буду рад любой помощи:) Спасибо!

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

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

Автокомментарий: текст был обновлен пользователем AllDogsAreBeautiful (предыдущая версия, новая версия, сравнить).

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

С точки проводим бесконечный луч в рандомном направлении, считаем количество ребер которые пересекают этот луч. Если количество четное то снаружи, иначе внутри. Сложность O(N).

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

    Только это правильно только в предположении, что рандомно проведённый луч не пройдёт ни через какую вершину. Если пройдёт и если этим нельзя пренебрегать, то придётся морочиться с тем, что принадлежность краям двух разных отрезков иногда надо считать за 1 раз (например: проводим горизонтальный луч, один отрезок идёт вверх от этой точки, другой вниз от неё же), а иногда за 0 раз (например: проводим горизонтальный луч, оба отрезка идут вниз от этой точки).

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

      Проведите несколько рандомных лучей)

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

      Если луч прошёл через вершину текущего отрезка, то мы проверяем, что это строго верхняя вершина отрезка (если мы луч провели горизонтально), тогда засчитываем пересечение.
      ссылка

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

Разбить многоугольник на треугольники и проверить принадлежность точки каждому из них. Принадлежность треугольнику можно проверить через сравнение площадей.