![]() |
|
||||||||||
|
|
|
|||||
|
Всем, кого достали кривые Безье, посвящается... Написано коряво, но более-менее работает
![]() 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
Регистрация: Jun 2005
Сообщений: 1,805
|
Как оно работает?
|
|
|||||
|
Кучу точек соединяет кривой... У меня ушло довольно много времени на борьбу с тригонометрией флеша чтоб сделать это - вот и подумал, что может кому понадобится...
|
|
|||||
|
Banned
Регистрация: Jun 2005
Сообщений: 1,805
|
А кучу точек он откуда берет?
|
|
|||||
|
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Цитата:
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
|
Цитата:
Короче говоря. В маткаде графики по точкам строили? Плавную кривую получали? Вот это оно.P.S. можно юзать для ландшафтов в играх P.P.S. по поводу Path-а... Если он все же это умеет... Дайте сцылу!!! Я напьюсь с горя - столько времени убил... |
|
|||||
|
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Цитата:
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
|
Banned
Регистрация: Jun 2005
Сообщений: 1,805
|
Цитата:
|
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Есть ИНТЕРПОЛЯЦИЯ и АППРОКСИМАЦИЯ
Интерполяция - это построение кривой, проходящей через контрольные точки. Аппроксимация - это построение кривой, проходящей не обязательно через контрольные точки, но их учитывая. Подробнее здесь http://www.fit.com.ru/Surveys/Course/Lecture_04.doc Методы постройки различные. Можно наглядно посмотреть здесь http://ibiblio.org/e-notes/Splines/Intro.htm |
|
|||||
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:51. |
|
|
« Предыдущая тема | Следующая тема » |
|
|