Расчет точки пересечения на основе угла и скорости - PullRequest
3 голосов
/ 03 декабря 2009

У меня есть вектор, состоящий из точки, скорости и направления. Мы назовем этот вектор R. И еще один вектор, который состоит только из точки и скорости. Нет направления. Мы назовем это T. Теперь я пытаюсь найти кратчайшую точку пересечения этих двух векторов. Поскольку T не имеет направления, это оказывается трудным. Мне удалось создать формулу, которая работает в CaRMetal, но я не могу заставить ее работать в Python. Может кто-нибудь предложить более эффективный способ решения этой проблемы? Или решить мою существующую формулу для X?

Формула:

Formula
(источник: bja888.com )

Key:

Definitions
(источник: bja888.com )

Где o или k - разность скоростей между векторами. R.speed / T.speed

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

Моя математика может быть немного ржавой, но попробуйте это:

p и q - векторы положения, d и e - векторы направления. Через время t вы хотите, чтобы они были в том же месте:

(1) p + t * d = q + t * e

Так как вы хотите вектор направления e , напишите его так

(2) e = (p-q) / t + d

Теперь вам не нужно время t , которое вы можете рассчитать, используя ограничение скорости s (в противном случае вы можете просто перейти непосредственно к другой точке):

Вектор направления e должен иметь длину с , поэтому

(3) e 1 2 + e 2 2 = s 2

После некоторого решения уравнения вы получите

(4)

I) a = сумма (p-q) / (s 2 -сумма (d 2 ))

II) b = 2 * сумма (d * (pq)) / (s 2 -сумма (d 2 ))

III) c = -1

IV) a + b * t + c * t 2 = 0

Сумма распространяется на ваши векторные компоненты (2 в 2d, 3 в 3d)

Последняя является квадратичной формулой, которую вы должны решить самостоятельно; -)

0 голосов
/ 03 декабря 2009

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

Нам нужно определить еще несколько терминов.

Point A         - the position associated with vector R.
Point B         - the position associated with vector T.
Vector AB    - the vector from point A to point B
Angle beta  - the angle between vector R and vector AB.
Angle theta - the angle between vector T and vector AB

Формула обычно задается как

theta = asin( |R| * sin(beta) / |T| )

, где

бета = acos (AB.x R.x + AB.y R.y)

Вы не хотите использовать это напрямую, поскольку asin и acos возвращают только углы от -PI / 2 до PI / 2.

beta  = atan2( R.y, R.x  ) - atan2( AB.y, AB.x )
x        = |R| * sin(beta) / |T|
y        = 1 + sqrt( 1 - x*x )
theta = 2*atan2( y, x )

Конечно, если x> 1 R слишком быстро и пересечение не существует

EG

0 голосов
/ 03 декабря 2009

ОК, если я вас правильно понял, у вас есть

R = [xy0, v, r] T = [xy1, v]

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

0 голосов
/ 03 декабря 2009
  1. Давайте предположим, что первая точка, А, имеет нулевую скорость. В этом случае это должно быть очень просто найти направление, которое даст самое быстрое пересечение.
  2. Теперь у есть скорость. Мы можем заставить его иметь нулевую скорость, вычтя его вектор скорости из вектора B. Теперь мы можем решить, как это было в 1.

Просто грубая идея, которая пришла в голову ...

Еще несколько мыслей:

Если A стоит неподвижно, то направление B, в котором нужно двигаться, находится непосредственно в направлении A. Это дает нам направление в системе координат, в которой A стоит неподвижно. Давайте назовем это д.

Теперь нам нужно только преобразовать направление B, необходимое для перемещения из системы координат, в которой A все еще находится, в систему координат, в которой A движется с заданной скоростью и направлением d2.

Это просто векторное сложение. d3 = d - d2 Теперь мы можем найти направление d3.

И немного более формально:

А стационарно :

Sb = скорость B, известная скалярная

alpha = atan2 (a_y-b_y, a_x-b_x)

Vb_x = Sb * cos (alpha)

Vb_y = Sb * sin (alpha)

A движется со скоростью Sa, направление бета :

Vb_x '= Sb * cos (альфа) + Sa * cos (бета)

Vb_y '= Sb * sin (альфа) + Sa * sin (бета)

alpha '= atan2 (Vb_y', Vb_x ')

Выше не проверялось, но на первый взгляд это выглядит разумно ...

...