Показать сообщение отдельно
Старый 19.05.2008, 22:45
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 8  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
Код:
//Пригодится
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. Поэксперементировал... ну флеш над дробями и издевается. В примере красный шар должен летать четко по зеленой линии.
Вложения
Тип файла: zip test4.zip (5.8 Кб, 83 просмотров)


Последний раз редактировалось Vertax; 20.05.2008 в 01:48.