Столкновение сегмента с кругом

Я изо всех сил пытаюсь найти твердое решение для обнаружения столкновений между кругом и сегментом круга. Представьте себе конус поля зрения для игрового врага с кругами, представляющими интересующие объекты.

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

1284] Я понимаю, как быстро исключить крайние случаи, я отбрасываю любые цели, которые не сталкиваются со всем кругом, и любые случаи, когда центр основного круга находится внутри целевого круга, автоматически считаются истинными (E на диаграмме).

Я изо всех сил пытаюсь найти хороший способ проверить остальные случаи.

Моя самая успешная на сегодняшний день попытка заключалась в определении углов векторов ca1 и ca2 и проверке, лежит ли какой-либо из них между углами векторов a1 и a2. Это работает в некоторых случаях, как описано выше, но не в ситуациях, когда целевой круг больше сегмента.

Редактировать 2 После реализации лучшего предложения снизу все еще остается ложное срабатывание, которое я не знаю, как лучше всего устранить. См. Розовую диаграмму ниже. Круг в правом нижнем углу сообщает о столкновении с сегментом, потому что его границы перекрывают как полупространство, так и основной круг.

collision types current solution

false positive edge case


Окончательное редактирование

После обнаружения другого граничного случая (4-е изображение) я остановился на подходе который сочетает в себе два основных ответа снизу и, кажется, охватывает все основы. Я опишу это здесь для тех, кто последует за ним.

Сначала исключите все, что не проходит тест быстрого перехода от круга к кругу.

Затем проверьте на столкновение между кругом и двумя внешними линиями сегмента. Если он касается любого из них, вернуть истину.

Наконец, выполните пару тестов «точка-полупространство», используя центр круга и две внешние линии (как описано ниже Гаретом). Если он проходит оба из них, в противном случае верните false.

8
задан beeglebug 23 November 2010 в 20:58
поделиться