Добавлен Bornikkeny
Всем привет. У меня детский вопрос и кажется я тупой, т.к. не могу решить элементарного.
Я имею:
Юнит который двигается со скоротью (допустим) 280 ед.
Юнит который целится в бегущего Юнита. Его снаряд движется со скоротью 1200 ед.
Расстояние между двумя Юнитами - 600 ед.
Юнит который двигается со скоротью (допустим) 280 ед.
Юнит который целится в бегущего Юнита. Его снаряд движется со скоротью 1200 ед.
Расстояние между двумя Юнитами - 600 ед.
Что я хочу получить:
Как вычислить угол "c" что бы целившийся Юнит подкорректировал свое оружие и снаряд попал как раз в цель?
Как вычислить угол "c" что бы целившийся Юнит подкорректировал свое оружие и снаряд попал как раз в цель?
Если хреново описал, извините. Говало реально не хочет работать :(
(upd)Сам дошел своими мозгами.
//===============Вспомогательные_функции================
function GetAngleXY takes real x, real y, real xx, real yy returns real
return bj_RADTODEG * Atan2(yy - y, xx - x)
endfunction
function GetDisXY takes real x, real y, real xx, real yy returns real
return SquareRoot((xx-x) * (xx-x) + (yy-y) * (yy-y))
endfunction
function GetPolarX takes real x, real f, real d returns real
return x + Cos(f*0.0174)*d
endfunction
function GetPolarY takes real y, real f, real d returns real
return y + Sin(f*0.0174)*d
endfunction
//=======================Основная часть=======================
function GetTargetOffset takes unit host, unit target, real speedm returns real
local real speedt = GetUnitMoveSpeed(target)
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real xx = GetUnitX(target)
local real yy = GetUnitY(target)
local real fac = GetUnitFacing(target)
local real dis = GetDisXY(x,y,xx,yy)
local real time = dis/speedm
local real dispost = GetDisXY(xx,yy,GetPolarX(xx,fac,time*speedt),GetPolarY(yy,fac,time*speedt))
local real X = GetPolarX(xx,fac,dispost) //нужные координаты цели
local real Y = GetPolarY(yy,fac,dispost)
return GetAngleXY(x,y,X,Y)//возвращает угол который нужен для корректировки стрельбы
endfunction
Принятый ответ
BaHeK:
GF RaiseD:
Вод мою систему такой расчет не подойдет.Darknessay, я имел ввиду изначальное расстояние между объектами.Вот нарисовал схематично.Обозначим расстояние которое прошёл 1 юнит за х. Красная линия это путь который прошел юнит 2 до встречи. Двигались они одинаковое время, значит составим равенство(s1 и s2 это скорости) и немного преобразуем.sqrt(a^2 + (b-x)^2)/s1 = x/s2 s1^2(a^2 + b^2)x^2 + 2*s1^2*b*x - s1^2(a^2 + b^2) = 0
Решаем полученное уравнение и получаемx1 = (-2*s1^2*b + sqrt((2*s1^2*b)^2 + 4*(s2^2 - s1^2)*s1^2(a^2 + b^2))) / (2*s1^2(a^2 + b^2)) x2 = (-2*s1^2*b - sqrt((2*s1^2*b)^2 + 4*(s2^2 - s1^2)*s1^2(a^2 + b^2))) / (2*s1^2(a^2 + b^2))
Искомый угол равен arctg((b-x)/a).
GF RaiseD:
Убрал синтаксические ошибки, немного "допилил" - не хочет работать.Это не в одну строку посчитатьfunction getTargetOffset takes unit Caster, unit Target, real targetSpeed, real missileSpeed returns real local real x1 = GetUnitX(Caster) local real x2 = GetUnitX(Target) local real x3 local real X4 //Координата X точки пересечения local real y1 = GetUnitY(Caster) local real y2 = GetUnitY(Target) local real y3 local realY4 //Координата Y точки пересечения local real targetSpeed local real missileSpeed local real distancex1x2 = Sqrt(Pow(x2-x1,2)+Pow(y2-y1,2)) local real distancex1x3 local real distanceX4Y4 set x3 = GetUnitX(Target)+targetSpeed*distaancex1x2/missileSpeed*Cos(GetUnitFacing(Target))*bj_DEGSTORAD set y3 = GetUnitY(Target)+targetSpeed*distaancex1x2/missileSpeed*Sin(GetUnitFacing(Target))*bj_DEGSTORAD set distaancex1x3 = Sqrt(Pow(x3-x1,2)+Pow(y3-y1,2)) set X4 = GetUnitX(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Cos(GetUnitFacing(Target))*bj_DEGSTORAD set Y4 = GetUnitY(Target)+targetSpeed*distancex1x2/missileSpeed*distancex1x3/distancex1x2*Sin(GetUnitFacing(Target))*bj_DEGSTORAD set Caster = null set Target = null set distanceX4Y4 = Sqrt(Pow(X4-x2,2)+PowY4-y2,2)) // Опережение (по отношению к повороту юнита-цели) return distanceX4Y4 endfunction
Если что - я не проверял. Но должно бы работать.
Если тебе нужен угол с точки x2 на точку x3, определяется он так:Atan2(y3-y2,x3-x2)*bj_RADTODEG
Всем привет работяги, я сам справился. Проверил: всё работает.
//===============Вспомогательные_функции================
function GetAngleXY takes real x, real y, real xx, real yy returns real
return bj_RADTODEG * Atan2(yy - y, xx - x)
endfunction
function GetDisXY takes real x, real y, real xx, real yy returns real
return SquareRoot((xx-x) * (xx-x) + (yy-y) * (yy-y))
endfunction
function GetPolarX takes real x, real f, real d returns real
return x + Cos(f*0.0174)*d
endfunction
function GetPolarY takes real y, real f, real d returns real
return y + Sin(f*0.0174)*d
endfunction
//=======================Основная часть=======================
function GetTargetOffset takes unit host, unit target, real speedm returns real
local real speedt = GetUnitMoveSpeed(target)
local real x = GetUnitX(host)
local real y = GetUnitY(host)
local real xx = GetUnitX(target)
local real yy = GetUnitY(target)
local real fac = GetUnitFacing(target)
local real dis = GetDisXY(x,y,xx,yy)
local real time = dis/speedm
local real dispost = GetDisXY(xx,yy,GetPolarX(xx,fac,time*speedt),GetPolarY(yy,fac,time*speedt))
local real X = GetPolarX(xx,fac,dispost) //нужные координаты цели
local real Y = GetPolarY(yy,fac,dispost)
return GetAngleXY(x,y,X,Y)//возвращает угол который нужен для корректировки стрельбы
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Как узнать координаты места пересечения снаряда и бегающего Юнита?
Ред. WarSC
у= а2 х+ b2
Ред. BaHeK
Ред. BaHeK
Ред. Raised
Если тебе нужен угол с точки x2 на точку x3, определяется он так:
Ред. Bornikkeny
GF RaiseD: Убрал синтаксические ошибки, немного "допилил" - не хочет работать.