|
|
|||||
Интерполирование
Всем, кого достали кривые Безье, посвящается... Написано коряво, но более-менее работает
MovieClip.prototype.drawBezier = function(POINTS){ ANGLE = new Array(); for(i_=0;i_<POINTS.length;i_++){ cPx = POINTS[i_].x; cPy = POINTS[i_].y; if(POINTS[i_+1]!=undefined){ cPNx = POINTS[i_+1].x; cPNy = POINTS[i_+1].y; } else{ cPNx = POINTS[i_].x; cPNy = POINTS[i_].y; } if(POINTS[i_-1]!=undefined){ cPPx = POINTS[i_-1].x; cPPy = POINTS[i_-1].y; } else{ cPPx = POINTS[i_].x; cPPy = POINTS[i_].y; } Points = [{x:cPPx,y:cPPy},{x:cPx,y:cPy},{x:cPNx,y:cPNy}]; d1 = Math.sqrt(Math.pow(Points[0].x - Points[1].x,2) + Math.pow(Points[0].y - Points[1].y,2)); d2 = Math.sqrt(Math.pow(Points[2].x - Points[1].x,2) + Math.pow(Points[2].y - Points[1].y,2)); if(d2!=0){ xc = Points[1].x + (d1/d2)*(Points[2].x-Points[1].x); yc = Points[1].y + (d1/d2)*(Points[2].y-Points[1].y); } else { xc = Points[1].x; yc = Points[1].y; } angle = Math.atan2(yc - Points[0].y,xc - Points[0].x); ANGLE.push(angle); } for(i_=0;i_<POINTS.length-1;i_++){ cPx = POINTS[i_].x; cPy = POINTS[i_].y; if(POINTS[i_+1]!=undefined){ cPNx = POINTS[i_+1].x; cPNy = POINTS[i_+1].y; } else{ cPNx = POINTS[i_].x; cPNy = POINTS[i_].y; } if(POINTS[i_-1]!=undefined){ cPPx = POINTS[i_-1].x; cPPy = POINTS[i_-1].y; } else{ cPPx = POINTS[i_].x; cPPy = POINTS[i_].y; } rad = Math.sqrt(Math.pow(cPx - cPNx,2)+Math.pow(cPy - cPNy,2))/5; Points = [{x:cPPx,y:cPPy},{x:cPx,y:cPy},{x:cPNx,y:cPNy}]; C1x = Points[1].x + rad*Math.cos(ANGLE[i_]); C2x = cPNx - rad*Math.cos(ANGLE[i_+1]); C1y = Points[1].y + rad*Math.sin(ANGLE[i_]); C2y = cPNy - rad*Math.sin(ANGLE[i_+1]); t = 0; this.moveTo(cPx,cPy); while(t<1){ t+=0.01; coeff1 = Math.pow(1-t,3); coeff2 = 3*Math.pow(1-t,2)*t; coeff3 = 3*(1-t)*Math.pow(t,2); coeff4 = Math.pow(t,3); rx = coeff1*cPx+coeff2*C1x+coeff3*C2x+coeff4*cPNx; ry = coeff1*cPy+coeff2*C1y+coeff3*C2y+coeff4*cPNy; this.lineTo(rx,ry); } } this.lineStyle(5,0x3366CC,100); for(i_=0;i_<POINTS.length;i_++){ this.moveTo(POINTS[i_].x,POINTS[i_].y); this.lineTo(POINTS[i_].x+1,POINTS[i_].y); } } _root.onMouseUp = function(){ _root.createEmptyMovieClip("lc",1); L = new Array(); for(i=0;i<10;i++) L.push({x:Math.random()*550,y:Math.random()*400}); _root["lc"].lineStyle(1,0x707070,100); _root["lc"].drawBezier(L); } |
|
|||||
Banned
[5 01.09.2006]
Регистрация: Jun 2005
Сообщений: 1,805
|
Как оно работает?
|
|
|||||
Кучу точек соединяет кривой... У меня ушло довольно много времени на борьбу с тригонометрией флеша чтоб сделать это - вот и подумал, что может кому понадобится...
|
|
|||||
Banned
[5 01.09.2006]
Регистрация: Jun 2005
Сообщений: 1,805
|
А кучу точек он откуда берет?
|
|
|||||
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Цитата:
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
Цитата:
P.S. можно юзать для ландшафтов в играх P.P.S. по поводу Path-а... Если он все же это умеет... Дайте сцылу!!! Я напьюсь с горя - столько времени убил... |
|
|||||
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Цитата:
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
Banned
[5 01.09.2006]
Регистрация: Jun 2005
Сообщений: 1,805
|
Цитата:
|
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Есть ИНТЕРПОЛЯЦИЯ и АППРОКСИМАЦИЯ
Интерполяция - это построение кривой, проходящей через контрольные точки. Аппроксимация - это построение кривой, проходящей не обязательно через контрольные точки, но их учитывая. Подробнее здесь http://www.fit.com.ru/Surveys/Course/Lecture_04.doc Методы постройки различные. Можно наглядно посмотреть здесь http://ibiblio.org/e-notes/Splines/Intro.htm |
|
|||||
Цитата:
|
Часовой пояс GMT +4, время: 10:04. |
|
« Предыдущая тема | Следующая тема » |
|
|