2016-01-09 3 views
-1

Привет, я пишу программу в java (но я думаю, что это не так важно для этого вопроса), где два робота (круги) движутся вокруг. Робот движется с определенной скоростью от определенного места до определенного места. Проблема заключается в том, как определить, имеют ли круги столкновение. Я не могу использовать середину точки круга и вектор его движения, потому что круг имеет радиус. Другая проблема: я просто не могу проверить конечные местоположения кругов. Мне нужно проверить, не сталкивается ли столкновение по пути, и если оно в одно и то же время. У кого-нибудь есть идея, как вычислить это?Столкновение двух кругов

enter image description here

+2

Ваш вопрос немного неясен. Вы хотите проверить, если они сталкиваются * прямо сейчас * или если они * когда-нибудь столкнутся какое-то время в будущем *? И как насчет * когда-то сталкивался в прошлом, вы тоже хотите это проверить? –

+0

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

+0

Вы проверили существующие решения, такие как [этот] (http://ericleong.me/research/circle-circle/)? –

ответ

3

P1 = (x1, y1) и P2 = (x2, y2) являются исходные координаты Давайте, V1 = (vx1, vy1) и V2 = (vx2, vy2) являются скоростями, R1 и R2 являются круг Радия. Круги сталкиваются, если центр-центр расстояние меньше, чем R1 + R2 (или квадрат расстояния меньше, то RR=(R1+R2)^2)

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

Простой подход - использование принципа Галилея, работающего в системе координат, связанного с первым объектом. В этой системе он остается в нулевой точке, а второй объект перемещается с начальной точкой (x2-x1, y2-y1) и скоростью (vx2-vx1, vy2-vy1). Координаты второго объекта через время:

X = (x2-x1) + (vx2-vx1) * t = dx + vx * t 
Y = (y2-y1) + (vy2-vy1) * t = dy + vy * t 

Разница между квадрату расстояния и RR равен нулю, когда столкновение происходит

D^2 - RR = X*X + Y*Y - RR = 
dx^2 + 2*dx*vx * t + vx^2 * t^2 + dy^2 + 2*dy*vy * t + vy^2 * t^2 - RR = 
(vx^2+vy^2) * t^2 + 2*(dx*vx+dy*vy) * t + (dx^2+dy^2-RR) = 0 

Решить последнюю квадратное уравнение против t. Если существует правильный (положительный, наименьший положительный) корень, то в этот момент происходит столкновение.

1

Я могу придумать пару подходов:

  1. Смоделировать движение - «двигаться» роботы вперед на расстояние, вычисленное от их скорости и интервала времени моделирования (короткий), то определить, достаточно ли они, чтобы столкнуться. Повторяйте, пока они не столкнутся или не достигнут места назначения.
  2. Вместо использования одной строки, представляющей середину робота/круга, вы можете использовать две строки, представляющие края робота.

Удачи.

-2

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

Чтобы проверить, не попало ли столкновение, проверьте, меньше ли расстояние между двумя кругами, чем сумма радиуса как И, так и небольшое значение, и если в следующем тике это значение еще меньше.

+0

OP хочет знать, столкнулись ли они в пути, а не только * сталкиваются прямо сейчас *. –

+0

@SimonForsbergMcFeely Исправлено. – Gustavo6046