![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
2Alex_beginner
Насколько мне известно при равнозмедленном движении, скорость за определенный промежуток времени уменьшается на одно и то же значение. Но "на одно и то же" и "в одно и то же" - разные вещи (:
__________________
while(1) {} Последний раз редактировалось Division; 04.08.2008 в 17:50. |
|
|||||
|
Регистрация: 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. |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
Цитата:
Цитата:
Его рассчитывать нужно по линейному закону (R=k*x+b), в случае равнозамедленного (равноускоренного) движения и оно же является константой, в случае равномерного движения. Будет время, постраюсь эту теорию выразить в практическом примере.
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:48. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|