Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.08.2008, 17:21
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 11  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
2Alex_beginner
Насколько мне известно при равнозмедленном движении, скорость за определенный промежуток времени уменьшается на одно и то же значение. Но "на одно и то же" и "в одно и то же" - разные вещи (:
__________________
while(1) {}


Последний раз редактировалось Division; 04.08.2008 в 17:50.
Старый 05.08.2008, 12:41
alrusdi вне форума Посмотреть профиль Отправить личное сообщение для alrusdi Найти все сообщения от alrusdi
  № 12  
Ответить с цитированием
alrusdi

Регистрация: Nov 2005
Сообщений: 75
Alex_beginner Мудрено уж больно для меня.
По сути Вы предлагаете искать R для каждого участка ломаной? А R - это расстояние от начало участка до рассчитываемого текущего положения точки? Так, в принципе, в приведенном выше коде и делается.
Division А как Вы предлагаете изменять текущую скорость? Точнее ясно, что нужно вычитать из текущей скорости какую то константу, но как эту константу определить?
Вот так корректнее:
Код:
//создадим объект, который будет двигаться равнозамедленно по ломаной
_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]);
}

//укажем время за которое объект должен пройти дистанцию
var mymotiontime=48
//высчитаем необходимую скорость движения
//скорость визуализации движения также будет зависеть от fps ролика
var mypathspeed=mypathlenght/mymotiontime;
//вычислим какое у объекта должно быть ускорение
//чтобы к концу дистанции объект остановился
var myacceleration=(mypathspeed/(mymotiontime*2));
_root.onEnterFrame= function(){
	//посчитаем дистанцию которую на данный момент должен пройти объект
	myobjdistance+=mypathspeed;
	//определим отрезок на котором будет находится объект в данный момент
	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;
	}
	//уменьшим скорость на величину ускорения (движение равнозамедленное)
	mypathspeed-=myacceleration;
	//переместим объект от начала текущего отрезка
	//на посчитаное выше расстояние вдоль нормализованного вектора данного отрезка
	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; 05.08.2008 в 13:41.
Старый 05.08.2008, 17:06
Alex_beginner вне форума Посмотреть профиль Отправить личное сообщение для Alex_beginner Найти все сообщения от Alex_beginner
  № 13  
Ответить с цитированием
Alex_beginner
 
Аватар для Alex_beginner

Регистрация: May 2008
Сообщений: 476
Цитата:
2Alex_beginner
Насколько мне известно при равнозмедленном движении, скорость за определенный промежуток времени уменьшается на одно и то же значение. Но "на одно и то же" и "в одно и то же" - разные вещи (:
Division! Мне не совсем понятно, что Вы этим хотели сказать?

Цитата:
Alex_beginner Мудрено уж больно для меня.
По сути Вы предлагаете искать R для каждого участка ломаной? А R - это расстояние от начало участка до рассчитываемого текущего положения точки? Так, в принципе, в приведенном выше коде и делается.
alrusdi! R это не расстояние от начала участка до рассчитываемой текущей точки, а расстояние от точки на предыдущей итерации до текущей рассчитываемой.
Его рассчитывать нужно по линейному закону (R=k*x+b), в случае равнозамедленного (равноускоренного) движения и оно же является константой, в случае равномерного движения.

Будет время, постраюсь эту теорию выразить в практическом примере.
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:48.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.