![]() |
|
||||||||||
|
|||||
|
Регистрация: 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, время: 19:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|