Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Action script 2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=49)
-   -   Построение сплайна (http://www.flasher.ru/forum/showthread.php?t=54291)

alexei_z 02.02.2004 00:27

Построение сплайна
 
Проблема такая: нужно по траектории движения мышки построить гладенький сплайн. Т.е. нельзя взять и просто через все точки провести его, нужен какойто механизм, который уберет все лишние точки.
В общем-то это точ в точ повторяет инструмент Pencil когда выбираешь Smooth во Flash-e.
Только это должно быть в swf :)

Есть какие-нибудь алгоритмы?

Подскажите пожалуйста.

Dr.OH 02.02.2004 19:15

тебе нуже алгортим построения кривой или что?

alexei_z 02.02.2004 20:32

Ну в общем да. Алгоритм. Ну и реально ли это на флеше сделать?

Dr.OH 02.02.2004 21:54

делается это элементарно. Строится кубический полином по заданным точкам с нужным шагом... вот собственно и все. Попытаюсь дать пример, но на C++, на Flash'е ты врядли разберешь - там еще по кадрам разбито:
Код:

//функции для рисования кривой Безье
void drawCurve(GLfloatPoint x1, GLfloatPoint x2, GLfloatPoint s1, GLfloatPoint s2) {
        //next - x2; cur - x1
                                //коэффициенты кусочного кубического полинома третьей степени
        const GLfloatPoint A(s2.x+s1.x-2*(x2.x-x1.x),  s2.y+s1.y-2*(x2.y-x1.y));
        const GLfloatPoint B(3*(x2.x-x1.x)-2*s1.x-s2.x, 3*(x2.y-x1.y)-2*s1.y-s2.y);
        const GLfloatPoint C(s1.x, s1.y);
        const GLfloatPoint D(x1.x,x1.y);
        for (GLfloat dt = 0; dt<=1; dt+=0.01) {
                float t3=dt*dt*dt; float t2=dt*dt; float t1=dt;
                float x = A.x*t3+B.x*t2+C.x*t1+D.x;
                float y = A.y*t3+B.y*t2+C.y*t1+D.y;
                m_cv.lineTo(x,y);
        }
}
void curveMid(GLfloatPoint prev, GLfloatPoint cur, GLfloatPoint next, GLfloatPoint n_next) {
        const float m(0.5);
        const GLfloatPoint Sk0 (m*(next.x-prev.x),  m*(next.y-prev.y) );
        const GLfloatPoint Sk1 (m*(n_next.x-cur.x), m*(n_next.y-cur.y));
        drawCurve(cur,next,Sk0,Sk1);
}
void curveBegin(GLfloatPoint prev, GLfloatPoint cur, GLfloatPoint next) {
        const float m(0.5);
        const GLfloatPoint Sk1 (m*(next.x-prev.x), m*(next.y-prev.y));
        const GLfloatPoint Sk0 (0.5*(3*(cur.x-prev.x)-Sk1.x),0.5*(3*(cur.y-prev.y)-Sk1.y));
        drawCurve(prev,cur,Sk0,Sk1);
}

void curveEnd(GLfloatPoint prev, GLfloatPoint cur, GLfloatPoint next) {
        const float m(0.5);
        const GLfloatPoint Sk0 (m*(next.x-prev.x), m*(next.y-prev.y));
        const GLfloatPoint Sk1 (0.5*(3*(next.x-cur.x)-Sk0.x),0.5*(3*(next.y-cur.y)-Sk0.y));
        drawCurve(cur,next,Sk0,Sk1);
}

если не разберешься могу прокомментировать....

Dr.OH 02.02.2004 21:55

да, совсем забыл GLFloatPoint - это объект с элментами x и y типа float.

alexei_z 03.02.2004 00:08

Спасибо!
 
Я сейчас попытаюсь переложить это на флеш. Но если ты уже делал это на Флеше, может подгонишь? Я быстрее разберусь :)

Спасибо.

Dr.OH 03.02.2004 00:37

без проблем кину, тока там метр, т.е. весть проект целиком... честно говоря, по-моему в том, что на С++ намного легче разобраться...
последние три функции особым образом задают коэффициенты, а первая строит параметрическую кривую.

alexei_z 03.02.2004 00:58

Я примерно понял код, но не до конца. Вообще мне сложно понять потому что я не очень в математике...
Если есть желание - объясни поподробнее как этим воспользоваться.
Если есть возможность - исходник на Флеш - идеально.

Там я может всего не пойму (а всего я всеравно не пойму, надо было учиться лучше), но хот смогу методом подгона, проб, ошибок, тестов и т.п. применить к своей задаче.

Ну и надо в исходники будет оязательно залить. Тема-то интересная!

Dr.OH 03.02.2004 01:24

могу кинуть описание того, как это вообще все делается, но только на почту - сюда не влезет, там 600Кб... так что давай почту - пришлю

alexei_z 03.02.2004 02:00

:))))))))

zadelo@kaluga.ru

Жду, с нетерпением!!!!

Потом отпишу как там что получилось!


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

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