Я вижу это так:
, поэтому вы находите направление от игрока (коричневая линия), которое касается препятствия с радиусом, увеличенным нарадиус игрока.
Давайте сначала определим некоторые вещи:
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)