пересечение капсула - луч (отрезок линии), 2D - PullRequest
0 голосов
/ 22 сентября 2018

Я программирую обнаружение столкновений C ++ в своей игре и пытаюсь придумать алгоритм: у меня есть капсула с двумя центральными точками (C1, C2), длиной и радиусом.Тогда у меня есть луч, определенный с двумя точками (R1, R2).Я уже знаю, что они пересекаются.Мне просто нужно найти внутреннюю часть луча, которая содержится в капсуле (H1-H2).Заранее спасибо за помощь.

image

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Сначала давайте взглянем на диаграмму для справки:

enter image description here

Процедура расчета H1 и H2 выглядит следующим образом:

  1. Вычислить пересечение, если оно есть, между лучом R и отрезком линии P1P2.Нас интересуют только пересечения, которые лежат внутри P1P2.Аналогично для P3P4.Точки от P1 до P4 могут быть легко вычислены из центров окружностей, C1 и C2 и некоторой векторной математики.Например, P1 = C1 + r*nC, где nC - нормаль (CCW) единичного вектора от C1 до C2.Этот ответ о SO обеспечивает необходимую математику для определения, существует ли пересечение между двумя отрезками линии, и, если это так, вычисляет параметр h, такой, что H=R1+h(R2-R1), где H - точка пересечения,На этом шаге можно получить 0, 1 или 2 действительных значения h, в зависимости от того, пересекает ли луч ни один, ни один, или оба из P1P2, P3P4.
  2. Вычислить точки пересечения, если таковые имеютсямежду лучом и каждым из двух кругов.Опять же, SO ответ предоставляет необходимую математику для пересечения луча с окружностью.Каждый круг может иметь пересечения 0, 1 или 2, которые снова представлены параметрически.
  3. Если на этапах 1 и 2 не было сгенерировано действительных значений h, то луч не пересекает капсулу.В противном случае вычислите hMin и hMax, минимальные и максимальные значения параметров всех действительных пересечений, определенных в шагах 1 и 2. Обратите внимание, что возможно, что hMin==hMax, в случае, когда луч касается одной из окружностейи не пересекается P1P2 или P3P4.Требуемая точка (точки) пересечения теперь может быть вычислена как H1=R1+hMin(R2-R1) и H2=R1+hMax(R2-R1).

Боюсь, что мой язык выбора - Java, а не C ++, но, надеюсь, вы найдетеКод ( IDEOne ) Я собрал полезные в качестве ссылки.Обратите внимание, что не было предпринято никаких усилий для решения проблем надежности, возникающих в результате округления значений double во время вычислений.

0 голосов
/ 22 сентября 2018

Аналитика: в глобальной системе координат определите линейное уравнение луча и различные сегменты капсулы, затем сравните и решите их.Начните с линейных сегментов капсулы, поскольку их легче решить быстрее.Вы можете определить каждый тип сегмента и локаторы пересечения как классы, это должно быть просто.

Числовое значение: если вы можете разбить капсулу на треугольники, вы можете использовать метод Мюллера-Трумбора для расчета точек пересечения.

...