
Код:
//Пригодится
ANGLE2D = function (X1, Y1, X2, Y2){return 180 * Math.atan2((X2 - X1), (Y2 - Y1)) / Math.PI;}
LEN2D = function (X1, Y1, X2, Y2){return Math.sqrt(Math.pow(X1 - X2, 2) + Math.pow(Y1 - Y2, 2));}
COS = function (ANGLE) {return Math.cos(ANGLE * Math.PI / 180);}
SIN = function (ANGLE) {return Math.sin(ANGLE * Math.PI / 180);}
Object.prototype.copy = function ()
{
var nOBJ = {};
for (var i in this) nOBJ[i] = this[i];
return nOBJ;
}
//Делаем вектор
vector = function (X, Y, DX, DY)
{
var OBJ = {};
OBJ.x = X;
OBJ.y = Y;
OBJ.dx = DX;
OBJ.dy = DY;
OBJ.speed = Math.sqrt(DX * DX + DY * DY);
return OBJ;
}
var B1 = vector(100, 100, 5, 0); //Цель
var B2 = vector(400, 400, 40, 0); //Стрелок
SIMULATE = function (LVL, LEN)
{
if (LVL > 100) return false; //Если более 100 шагов, то болт
BTEMP1.x += BTEMP1.dx;
BTEMP1.y += BTEMP1.dy;
bANGLE = 90-ANGLE2D(BTEMP2.x, BTEMP2.y, BTEMP1.x, BTEMP1.y);
currLEN = LEN2D(BTEMP1.x, BTEMP1.y, BTEMP2.x, BTEMP2.y);
if (currLEN < BTEMP2.speed) return {len:LEN, lvl: LVL}; //Если растояние до цели меньше шага, то попали
//Если нужно более точно, то {len:LEN + currLEN
BTEMP2.x += COS(bANGLE) * BTEMP2.speed;
BTEMP2.y += SIN(bANGLE) * BTEMP2.speed;
return SIMULATE(LVL + 1, LEN + BTEMP2.speed);
}
//Создаю временные копии
var BTEMP1 = B1.copy();
var BTEMP2 = B2.copy();
if (T = SIMULATE(0, 0)) //Это не опечатка
{
COOF = LEN2D(B2.x, B2.y, BTEMP1.x, BTEMP1.y) / T.len;
//Искомые точки
TC = {};
TC.x = (BTEMP1.x - B1.x) * COOF + B1.x;
TC.y = (BTEMP1.y - B1.y) * COOF + B1.y;
//Для примера
_root.lineStyle(1, 0xFF0000);
_root.moveTo(B1.x, B1.y);
_root.lineTo(TC.x, TC.y);
_root.lineStyle(1, 0x0000FF);
_root.moveTo(B2.x, B2.y);
_root.lineTo(TC.x, TC.y);
}
Думаю разберешся.
P.S. Поэксперементировал... ну флеш над дробями и издевается. В примере красный шар должен летать четко по зеленой линии.