Прогноз столкновения круг-круг (продолжение) - PullRequest
0 голосов
/ 03 июня 2018

Круг А движется вправо вдоль оси х.Круг B движется вверх вдоль оси y.Я хотел бы знать, собираются ли они столкнуться.(не тогда, просто если.)

Радиусы одинаковы, разные постоянные скорости.

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

Я не могу решить для t (времени) предоставленное уравнение (круги будут сталкиваться, если t существует):

(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2

Здесь снова в понятных терминах:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x - t*CircleB.velocity.x)^2
+
(CircleA.initialPosition.y + t*CircleA.velocity.y - 
 CircleB.initialPosition.y - t*CircleB.velocity.y)^2
=
(CircleA.radius + CircleB.radius)^2

Что в моем случае немного проще, поскольку круги движутся вдоль осей (скорость равна 0 на одной оси), а радиусы одинаковы:

(CircleA.initialPosition.x + t*CircleA.velocity.x - 
 CircleB.initialPosition.x)^2
+
(CircleA.initialPosition.y - CircleB.initialPosition.y - 
 t*CircleB.velocity.y)^2
=
(2*radius)^2

Тем не менее, я не могу решить эту проблему, и предоставленная ссылка на auto-solver также не помогает моей толстой голове.

(В частности, я не могуget

sqrt(-(D4 - D3)^2)

Выражение внутри sqrt () всегда отрицательно, поэтому оно всегда терпит неудачу. Чего мне не хватает?)

За исключением автоматического решения, я надеюсь, что кто-то может показать путь крешить уравнение для t (и, возможно, модератор может объединить вопросы, извините за беспокойство).

Или любой другой способ решения проблемы, возможно, с использованием встроенной функции box2d, о которой я не знаю.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

В принятом решении чего-то не хватает.Чтобы решить это уравнение с помощью:

x = (−b ± sqrt(b^2 - 4ac)) / 2a

, что означает:

x1 = (−b + sqrt(b^2 - 4ac)) / 2a и x2 = (−b - sqrt(b^2 - 4ac)) / 2a

Как минимум x1 илиx2 должен быть положительный , чтобы столкновение было правильно обнаружено.Если оба отрицательны, столкновения не будет.

0 голосов
/ 06 июня 2018

Ну, я разобрался, как решить уравнение для т.

(Oax + t*Dax - Obx - t*Dbx)^2 + (Oay + t*Day - Oby - t*Dby)^2 = (ra + rb)^2


(Oax * (Oax + t*Dax - Obx - t*Dbx) + t*Dax * (Oax + t*Dax - Obx - t*Dbx)
 - Obx * (Oax + t*Dax - Obx - t*Dbx) - t*Dbx * (Oax + t*Dax - Obx - t*Dbx))
+
(Oay * (Oay + t*Day - Oby - t*Dby) + t*Day * (Oay + t*Day - Oby - t*Dby)
 - Oby * (Oay + t*Day - Oby - t*Dby) - t*Dby * (Oay + t*Day - Oby - t*Dby))
=
(ra + rb)^2


Oax^2 + (Oax * t*Dax) - (Oax * Obx) - (Oax * t*Dbx)
 + (t*Dax * Oax) + (t*Dax)^2 - (t*Dax * Obx) - (t*Dax * t*Dbx)
 - (Obx * Oax) - (Obx * t*Dax) + Obx^2 + (Obx * t*Dbx)
 - (t*Dbx * Oax) - (t*Dbx * t*Dax) + (t*Dbx * Obx) + (t*Dbx)^2
+
Oay^2 + (Oay * t*Day) - (Oay * Oby) - (Oay * t*Dby)
 + (t*Day * Oay) + (t*Day)^2 - (t*Day * Oby) - (t*Day * t*Dby)
 - (Oby * Oay) - (Oby * t*Day) + Oby^2 + (Oby * t*Dby)
 - (t*Dby * Oay) - (t*Dby * t*Day) + (t*Dby * Oby) + (t*Dby)^2
=
(ra + rb)^2


t^2 * (Dax^2 +Dbx^2 - (Dax * Dbx) - (Dbx * Dax)
       + Day^2 +Dby^2 - (Day * Dby) - (Dby * Day))
+
t * ((Oax * Dax) - (Oax * Dbx) + (Dax * Oax) - (Dax * Obx)
      - (Obx * Dax) + (Obx * Dbx) - (Dbx * Oax) + (Dbx * Obx)
      + (Oay * Day) - (Oay * Dby) + (Day * Oay) - (Day * Oby)
      - (Oby * Day) + (Oby * Dby) - (Dby * Oay) + (Dby * Oby))
+
Oax^2 - (Oax * Obx) - (Obx * Oax) + Obx^2
  + Oay^2 - (Oay * Oby) - (Oby * Oay) + Oby^2 - (ra + rb)^2
=
0

Теперь это стандартная форма квадратного уравнения:

ax2 + bx + c = 0

решается так:

x = (−b ± sqrt(b^2 - 4ac)) / 2a       // this x here is t

где -

a = Dax^2 +Dbx^2 + Day^2 +Dby^2 - (2 * Dax * Dbx) - (2 * Day * Dby)

b = (2 * Oax * Dax) - (2 * Oax * Dbx) - (2 * Obx * Dax) + (2 * Obx * Dbx)
     + (2 * Oay * Day) - (2 * Oay * Dby) - (2 * Oby * Day) + (2 * Oby * Dby)

c = Oax^2 + Obx^2 + Oay^2 + Oby^2
    - (2 * Oax * Obx) - (2 * Oay * Oby) - (ra + rb)^2

t существует (столкновение произойдет), если -

(a != 0) && (b^2 >= 4ac)

ОБНОВЛЕНИЕ:

Как проницательно заметил Мо Амин Аллани, по крайней мере одно решение для t должно быть положительным, чтобы обнаружить столкновение в будущем, а не столкновение, которое предположительно имело место ранее.

...