|
|
|||||
Регистрация: Jan 2004
Адрес: Калуга
Сообщений: 7
|
Построение сплайна
Проблема такая: нужно по траектории движения мышки построить гладенький сплайн. Т.е. нельзя взять и просто через все точки провести его, нужен какойто механизм, который уберет все лишние точки.
В общем-то это точ в точ повторяет инструмент Pencil когда выбираешь Smooth во Flash-e. Только это должно быть в swf Есть какие-нибудь алгоритмы? Подскажите пожалуйста. |
|
|||||
тебе нуже алгортим построения кривой или что?
|
|
|||||
Регистрация: Jan 2004
Адрес: Калуга
Сообщений: 7
|
Ну в общем да. Алгоритм. Ну и реально ли это на флеше сделать?
|
|
|||||
делается это элементарно. Строится кубический полином по заданным точкам с нужным шагом... вот собственно и все. Попытаюсь дать пример, но на 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); } |
|
|||||
да, совсем забыл GLFloatPoint - это объект с элментами x и y типа float.
|
|
|||||
Регистрация: Jan 2004
Адрес: Калуга
Сообщений: 7
|
Спасибо!
Я сейчас попытаюсь переложить это на флеш. Но если ты уже делал это на Флеше, может подгонишь? Я быстрее разберусь
Спасибо. |
|
|||||
без проблем кину, тока там метр, т.е. весть проект целиком... честно говоря, по-моему в том, что на С++ намного легче разобраться...
последние три функции особым образом задают коэффициенты, а первая строит параметрическую кривую. |
|
|||||
Регистрация: Jan 2004
Адрес: Калуга
Сообщений: 7
|
Я примерно понял код, но не до конца. Вообще мне сложно понять потому что я не очень в математике...
Если есть желание - объясни поподробнее как этим воспользоваться. Если есть возможность - исходник на Флеш - идеально. Там я может всего не пойму (а всего я всеравно не пойму, надо было учиться лучше), но хот смогу методом подгона, проб, ошибок, тестов и т.п. применить к своей задаче. Ну и надо в исходники будет оязательно залить. Тема-то интересная! |
|
|||||
могу кинуть описание того, как это вообще все делается, но только на почту - сюда не влезет, там 600Кб... так что давай почту - пришлю
|
|
|||||
Регистрация: Jan 2004
Адрес: Калуга
Сообщений: 7
|
|
Часовой пояс GMT +4, время: 11:50. |
|
« Предыдущая тема | Следующая тема » |
|
|