функция обнаружения столкновений в объективе-с / основной графике - PullRequest
1 голос
/ 01 ноября 2009

Есть ли встроенная функция для обнаружения столкновения между два круга?

Я использовал CGRectIntersectsRect(rect1,rect2) для найти пересечение между двумя прямоугольниками. Но если я хочу узнать, по какой оси x или y они пересекаются, как я найду его?

Есть ли встроенная функция или у вас есть другие идеи?

Ответы [ 2 ]

2 голосов
/ 04 июля 2010

Если это круги, точка столкновения (если она существует) будет лежать на линии, соединяющей их центры, и импульс каждому будет действовать в направлении от этой точки к центру круга.

Предполагая центры (x1, y1) и (x2, y2) и радиусы r1 и r2, круги сталкиваются, когда

(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) = (r1 + r2) * (r1 + r2)

Это просто ваша основная теорема Пифагора .

В большинстве случаев - несомненно, в том числе и у вас - обнаружение столкновений является скорее приблизительным, чем аналитическим делом. То есть вы перемещаете свои объекты небольшими шагами и проверяете на совпадение, а не решаете уравнения движения для точного момента контакта. Поэтому вместо того, чтобы искать приведенный выше случай, вы будете использовать неравенство , например:

(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) <= (r1 + r2) * (r1 + r2)

Когда это оценивается как истина, столкновение в основном уже произошло , и у вас есть два варианта: вы можете работать в обратном направлении, чтобы точно рассчитать, когда и где это произошло, или вы можете предположить, что ваши временные шаги Достаточно мал, чтобы время, когда вы заметили перекрытие, было достаточно близко к моменту контакта, чтобы служить разумной заменой. Опять же, очень вероятно, что это именно то, что вы хотите сделать, но имейте в виду, что это совершенно неточно: если ваши объекты движутся быстро относительно их размера, то это может выглядеть совершенно неправильно, или даже пропустить столкновения вообще (иногда с юмором как "квантовое туннелирование").

Поскольку круги, вероятно, немного перекрываются, вам необходимо определить точку контакта прокси - назовем ее (xp, yp). Поскольку это приблизительное значение, существует несколько способов его расчета, но разумным выбором может быть:

xp = x1 + (x2 - x1) * r1 / (r1 + r2)
yp = y1 + (y2 - y1) * r1 / (r1 + r2)

То есть на линии между центрами на расстоянии, пропорциональном радиусам. Если перекрытие небольшое, это должно быть довольно близко к реальной точке столкновения. Если он большой, у вас все равно проблемы.

Игнорируя любое вращение, каждый круговой объект будет испытывать толчок от этой точки столкновения к своему центру. Например, толчок объекта 1 будет действовать в направлении (x1 - xp, y1 - yp).

Чтобы понять, каким будет эффект - то есть, как объекты будут двигаться после этого - вам нужно учитывать массу каждого объекта и применять закон сохранения импульса. Читайте о упругих столкновениях и, возможно, если вы хотите смоделировать столкновения, которые не идеально упругие, коэффициент восстановления .

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

1 голос
/ 01 ноября 2009

Если это круги, тест тривиален. Просто сравните расстояние между их центрами с суммой их радиусов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...