Показать сообщение отдельно
Старый 03.01.2006, 19:03
K.A.T.A.F.A.L.K.E.R вне форума Посмотреть профиль Отправить личное сообщение для K.A.T.A.F.A.L.K.E.R Найти все сообщения от K.A.T.A.F.A.L.K.E.R
  № 1  
Ответить с цитированием
K.A.T.A.F.A.L.K.E.R
 
Аватар для K.A.T.A.F.A.L.K.E.R

Регистрация: Jul 2005
Адрес: Go, Ukraine!
Сообщений: 787
Отправить сообщение для K.A.T.A.F.A.L.K.E.R с помощью ICQ
По умолчанию Интерполирование

Всем, кого достали кривые Безье, посвящается... Написано коряво, но более-менее работает

Код HTML:
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);
}
Прикол в отсутствии касательных и проочего - интерполирование, мля