Какой минимальный угол необходим игроку, чтобы избежать препятствия? - PullRequest
0 голосов
/ 18 октября 2019

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

enter image description here

Ответы [ 2 ]

1 голос
/ 18 октября 2019
  1. Найти внутренние касательные.

    направление D - это ЛУЧ, когда обе касательные являются ЛИНИИ или СЕГМЕНТАМИ ЛИНИИ.

  2. , поэтому D имеет 2 угла с одной касательной1, как x &(180-x)
    выберите минимальное значение, так как t1

  3. найдите t2 в качестве второго шага.

    у вас есть 2 минимальных угла с обеими касательными, как t1 & t2

  4. минимум t1 & t2 этонаправление игрока должно быть повернуто, чтобы избежать препятствия.

1 голос
/ 18 октября 2019

Я вижу это так:

overview

, поэтому вы находите направление от игрока (коричневая линия), которое касается препятствия с радиусом, увеличенным нарадиус игрока.

Давайте сначала определим некоторые вещи:

p0=(x0,y0) // player position
dp=(dx,dy) // player direction 
p1=(x1,y1) // obstacle position
r0         // player radius
r1         // obstacle radius
t =(tx,ty) // intersection of new direction and (r0+r1) obstacle circle

, затем:

dot( t-p0 , t-p1 ) = 0 // perpendicular vectors
|t-p1| = r0+r1         // the intersection is at r0+r1 distance from obstacle center
dt=t-p0                // new direction

это приводит к системе квадратных уравнений:

(tx-x0)*(tx-x1) + (ty-y0)*(ty-y1) = 0
(tx-x1)*(tx-x1) + (ty-y1)*(ty-y1) = (r0+r1)*(r0+r1)

, такрешите его и выберите решение, которое ближе к p0 или имеет больший результат:

dot( t-p0 , dp )

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

ang = atan2(ty-y0,tx-x0) - atan2(dy,dx)
...