Я изо всех сил пытаюсь найти твердое решение для обнаружения столкновений между кругом и сегментом круга. Представьте себе конус поля зрения для игрового врага с кругами, представляющими интересующие объекты.
Я нарисовал диаграмму внизу, чтобы попытаться проработать некоторые возможные случаи, но я уверен, что их гораздо больше.
1284] Я понимаю, как быстро исключить крайние случаи, я отбрасываю любые цели, которые не сталкиваются со всем кругом, и любые случаи, когда центр основного круга находится внутри целевого круга, автоматически считаются истинными (E на диаграмме).
Я изо всех сил пытаюсь найти хороший способ проверить остальные случаи.
Моя самая успешная на сегодняшний день попытка заключалась в определении углов векторов ca1 и ca2 и проверке, лежит ли какой-либо из них между углами векторов a1 и a2. Это работает в некоторых случаях, как описано выше, но не в ситуациях, когда целевой круг больше сегмента.
Редактировать 2 После реализации лучшего предложения снизу все еще остается ложное срабатывание, которое я не знаю, как лучше всего устранить. См. Розовую диаграмму ниже. Круг в правом нижнем углу сообщает о столкновении с сегментом, потому что его границы перекрывают как полупространство, так и основной круг.
После обнаружения другого граничного случая (4-е изображение) я остановился на подходе который сочетает в себе два основных ответа снизу и, кажется, охватывает все основы. Я опишу это здесь для тех, кто последует за ним.
Сначала исключите все, что не проходит тест быстрого перехода от круга к кругу.
Затем проверьте на столкновение между кругом и двумя внешними линиями сегмента. Если он касается любого из них, вернуть истину.
Наконец, выполните пару тестов «точка-полупространство», используя центр круга и две внешние линии (как описано ниже Гаретом). Если он проходит оба из них, в противном случае верните false.