Показать сообщение отдельно
Старый 04.08.2008, 14:34
alrusdi вне форума Посмотреть профиль Отправить личное сообщение для alrusdi Найти все сообщения от alrusdi
  № 7  
Ответить с цитированием
alrusdi

Регистрация: Nov 2005
Сообщений: 75
Спасибо за внимание))
Может кому-нибудь в будущем понадобится этот код
Натуральным языком алгоритм описан Division, только что там про коэффициент K значит я так и не понял.
Alex_beginer, Что в данном случае подразумеваете под термином линейный сплайн? Опишите Ваш алгоритм натуральным языком?
Код:
//создадим объект, который будет двигаться равнозамедленно по ломаной
_root.createEmptyMovieClip("myobj", 1);
myobj.lineStyle(0, 0xFF0000, 100);
myobj.moveTo(-3, -3);
myobj.lineTo(3, -3);
myobj.lineTo(3, 3);
myobj.lineTo(-3, 3);
myobj.lineTo(-3, -3);

//массив точек ломаной
var mypath:Array = Array(
		Array(13,355),
		Array(50,305),
		Array(145,305),
		Array(229,267),
		Array(190,184),
		Array(268,127),
		Array(307,154),
		Array(294,241),
		Array(348,273),
		Array(408,225),
		Array(414,69)
);

var mypathlenght=0;
var myobjdistance=0;

//это для рисования ломаной
_root.lineStyle(0, 0x0000FF, 100);
_root.moveTo(mypath[0][0], mypath[0][1]);

for (var i=1; i<mypath.length; i++){
	//для каждого отрезка ломаной посчитаем его длину
	//хранить будем сумму длин отрезков до данного участка
	mypathlenght+=calcLength(mypath[i-1], mypath[i]);
	mypath[i][2]=mypathlenght;
	
	//также для каждого отрезка сохраним его нормализованный вектор
	//он даст нам направление движения
	mypath[i][3]=getNormalVector(mypath[i-1], mypath[i]);
	//нарисуем отрезок ломаной
	_root.lineTo(mypath[i][0], mypath[i][1]);
}

//высчитаем необходимую скорость движения
//скорость визуализации движения также будет зависеть от fps ролика
var mypathspeed=mypathlenght/33;
var curspeed=mypathspeed;

_root.onEnterFrame= function(){
	//посчитаем дистанцию которую на данный момент должен пройти объект
	myobjdistance+=curspeed;
	//определим отрезок на котором будет находится объект в данный момент
	var i = getIndexOfCurrentLine(myobjdistance);
	var locallength=0;
	if (i){
		if (i==-1){
			//объект дошел до конца пути
			//переместим его для точности в конечную точку траектории
			_root.onEnterFrame=null;
			i=mypath.length-1;
			_root.myobj._x=mypath[i][0];
			_root.myobj._y=mypath[i][1];
			return;
		}
		//объект находится на втором или последующих отрезках
		//посчитаем сколько он должен пройти от начала текущего отрезка
		var locallength=myobjdistance-mypath[i][2];
	}else{
		//объект на первом отрезке, значит общая дистанция которую он прошел
		//равна расстоянию пройденому им от начала отреска
		var locallength=myobjdistance;
	}
	//уменьшим скорость (движение равнозамедленное)
	curspeed*=0.97;
	//переместим объект от начала текущего отрезка
	//на посчитаное выше расстояние вдоль нормализованного вектора данного отрезка
	ix=mypath[i][0]+mypath[i+1][3][0]*locallength;
	iy=mypath[i][1]+mypath[i+1][3][1]*locallength;
	_root.myobj._x=ix;
	_root.myobj._y=iy;
}


function getIndexOfCurrentLine(ilength){
	for (var i=0; i<mypath.length; i++){
		if (ilength<mypath[i+1][2]){ return i;}
	}	
	return -1;
}

//расстояние между двумя точками равно корню из суммы квадратов
//разности соответствующих координат sqrt( (x2-x1)^2 + (y2-y1)^2 )
function calcLength(ar1, ar2){
	return Math.sqrt((ar2[0]-ar1[0])*(ar2[0]-ar1[0]) + (ar2[1]-ar1[1])*(ar2[1]-ar1[1]));
}

//чтобы нормализовать вектор нужно его составляющие поделить на длину
function getNormalVector(ar1, ar2){
        var ku = calcLength(ar1, ar2);
        nx = (ar2[0]-ar1[0]) / ku;
        ny = (ar2[1]-ar1[1]) / ku;
		return Array(nx, ny);
}


Последний раз редактировалось alrusdi; 04.08.2008 в 15:38.