Як перевірити, чи перетинаються коло та увігнутий багатокутник?


19

У мене є багатокутник (іноді опуклий, але часто увігнутий) і купа кіл з різними радіусами. Як я можу дізнатися, чи коло перетинається / перекривається багатокутником?

Я міг би розбити свій увігнутий багатокутник на опуклі шматочки. Чи допомогло б це?

Відповіді:


26

є два випадки цієї проблеми. Перше - це перетин і друге, що перекривається (містить).

Спочатку (перетин / багатокутник всередині кола):

Знайдіть найближчу точку на кожному краї багатокутника до центру кола. Якщо будь-яка відстань між найближчою точкою до центру менша за радіус, ви отримали перехрестя або перекриття.

Другий (коло ціле у багатокутнику): стріляйте промінь від центру кола вправо (або вліво / вгору / вниз) і рахуйте перетини променя / відрізка (країв багатокутника). Якщо число перетину є рівним, коло знаходиться поза полігоном. Якщо це дивне коло знаходиться всередині.

Я поділюсь піктограмою з лектуї для цього випадку:

введіть тут опис зображення

І подбайте про одиничні випадки.

Сподіваюсь, це допоможе.


редагувати: Я думаю, що справедливо додати кредити до картини. Автор - Петро Фелкель, доцент Чеського технічного університету в Празі


Я не думаю, що це спрацює, просто "прострілявши" промінь праворуч. Можливо, я неправильно прочитав ваш підхід, але з того, що я зрозумів, він не зможе встановити налаштування, як зображено тут: imgur.com/Whg2u
bummzack

2
Так, але це описано в першому випадку. Стрілецький промінь вирішить лише коло, що містить полігон (другий випадок в моєму описі). Ви повинні перевірити обидва випадки. Він швидкий, простий у реалізації та не потребує жодної пам’яті.
Нотабене

1
Вибачте, що я переплутав "край" з "вершиною" і тому неправильно витлумачив вашу першу перевірку. Якщо правильно прочитати, це працює :)
bummzack

7

Перший крок, як ви здогадуєтесь, - це розділення увігнутого багатокутника на кілька опуклих. Причиною цього є те, що ви будете використовувати теорему , що розділяє вісь , яка працює лише на опуклі багатокутники.

SAT як такий, працює лише на двох опуклих багатокутниках. "Вісь, що розділяє" в назві, відноситься до осей, перпендикулярних до країв багатокутника. Кола, на жаль, мають нескінченну кількість. Однак виявляється, що існує досить простий спосіб з'ясувати, яка з цих осей є актуальною, дивлячись на цей проект, який виступає назовні, щоб перетинати вершини багатокутника.

Замість того, щоб переглядати весь алгоритм тут, програмне забезпечення Metanet (виробники N / N +) мають хороший підручник з виявлення зіткнень за допомогою SAT , третій розділ якого охоплює SAT, коли одним із об’єктів є коло .


Чи є у вас посилання на розщеплення увігнутого багатокутника на опуклі багатокутники? Надане вами посилання SAT не згадує нічого подібного.
ehsanul

Це насправді дуже складна проблема в залежності від геометрії багатокутника, але всі тривимірні двигуни роблять це, оскільки апаратне забезпечення може загалом представляти лише копланарні квадратики та трикутники, а не багатокутники.
SplinterReality

1
@ehsanul: en.wikipedia.org/wiki/Polygon_triangulation описує кілька популярних підходів.

0

Ось що я роблю.

  1. Використовуйте тест горизонтальної лінії, щоб визначити, чи знаходиться центр кола всередині многокутника. Якщо це так, то вони перетинаються.
  2. Якщо ні, перевірте наступний випадок. Для кожної сторони багатокутника
    1. Знайдіть нахил сторони полігону
    2. Обчисліть перпендикулярний нахил
    3. (ЧИТАЙТЕ ЦЕ ДОКЛАДНО) Знайдіть перетин між лінією та ухилом сторони багатокутника, що перетинається з будь-якою вершиною, яка робить сторону, та лінією схилу, перпендикулярною до тієї сторони, яка перетинає центр кола.
    4. Якщо встановлена ​​точка перетину лежить всередині кола, це означає, що тобі коло в деякій точці перетинає сторону, про яку йдеться, і, отже, перетинає багатокутник.
  3. Нарешті, якщо нічого іншого не є переконливим, перевірте, чи якісь вершини багатокутника лежать всередині кола (через попередні тести, вам потрібно перевірити лише один раз) Якщо так, вони перетинаються. Якщо ні, то можна безперечно сказати, що вони цього не роблять.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.