Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Равнозамедленное движение по ломаной (http://www.flasher.ru/forum/showthread.php?t=114551)

Division 04.08.2008 17:21

2Alex_beginner
Насколько мне известно при равнозмедленном движении, скорость за определенный промежуток времени уменьшается на одно и то же значение. Но "на одно и то же" и "в одно и то же" - разные вещи (:

alrusdi 05.08.2008 12:41

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);
}


Alex_beginner 05.08.2008 17:06

Цитата:

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

Цитата:

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

Будет время, постраюсь эту теорию выразить в практическом примере.


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

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