Код:
/*
В© Ivan Dembicki, 2004, dembicki@narod.ru
please check updates: http://www.dembicki.org
Path class
version 1.1
*/
class Path {
var path_points:String = "", path_length:Number = 0;
var segments:Number = 0;
private var ln_array:Array;
function Path() {
this.ln_array = [];
var arg:Array = typeof arguments[0] == "number" ? arguments : arguments[0];
this.path_points=arg.toString(), this.path_length=0;
var k:Number = 0;
var i:Number;
var len:Number = arg.length;
var x0:Number = arg[0] || 0;
var y0:Number = arg[1] || 0;
var o:Object;
var x1:Number, y1:Number, x2:Number, y2:Number, ln:Array, a1:Number, a2:Number;
var a3:Number, a4:Number, a:Number, b:Number, c:Number, d:Number, e:Number, a2t:Number, sa:Number;
for (i=2; i<len; i += 4) {
x1 = arg[i] || 0;
y1 = arg[i+1] || 0;
if (i == (len-2)) {
x2 = arg[i+2] ? arg[i+2] : (arg[0] || 0);
y2 = arg[i+3] ? arg[i+3] : (arg[1] || 0);
} else {
x2 = arg[i+2] || 0;
y2 = arg[i+3] || 0;
}
ln = this.ln_array[k++]=[{_y:y0, _x:x0}, {_y:y1, _x:x1}, {_y:y2, _x:x2}];
o = ln[3]={};
a1 = o.a1=x0-2*x1+x2;
a2 = o.a2=y0-2*y1+y2;
a3 = o.a3=x0-x1;
a4 = o.a4=y0-y1;
a = o.a=4*(a1*a1+a2*a2);
b = o.b=-8*(a1*a3+a2*a4);
c = o.c=4*(a3*a3+a4*a4);
e = o.e=Math.sqrt(c);
d = Math.sqrt(c+b+a);
sa = Math.sqrt(a);
a2t = a*2;
ln[4] = (2*sa*(d*(b+a2t)-e*b)+(b*b-4*a*c)*(Math.log(2*e+b/sa)-Math.log(2*d+(b+a2t)/sa)))/(8*Math.pow(a, (3/2)));
if (isNaN(ln[4])) {
var del:Number = 100000;
arg[i] += Math.random()/del;
arg[i+1] += Math.random()/del;
arg[i+2] += Math.random()/del;
arg[i+3] += Math.random()/del;
arg[i+4] += Math.random()/del;
arg[i+5] += Math.random()/del;
i -= 4;
k--;
} else {
this.path_length += ln[4];
x0 = x2;
y0 = y2;
}
}
this.segments = k--;
}
public function getPoint(poz:Number, omit_rotation:Boolean):Object {
//added
if (poz > this.path_length) {
poz = this.path_length;
} else if (poz < 0) {
poz = 0;
}
//end added
poz = poz%this.path_length;
//poz<0 ? poz += this.path_length : "";
if(poz<0)poz += this.path_length;
if(!poz)poz += .00001;
if (this.segments<1) {
return false;
}
var i:Number = 0, ln:Number, len:Number = 0, ff:Number = 0;
for (i; i<=this.segments; i++) {
ln=this.ln_array[i], len += ln[4];
if (len>poz) {
ff = (poz-(len-ln[4]))/ln[4];
break;
}
}
var fn:Function = function (ff:Number):Number {
var o:Object = ln[3];
var a1:Number = o.a1, a2:Number = o.a2, a3:Number = o.a3, a4:Number = o.a4, a:Number = o.a, b:Number = o.b;
var c:Number = o.c, e:Number = o.e, i:Number = 1, st:Number = 1, f_l:Number = ln[4], t_l:Number = ff*f_l, max_i:Number = 100;
var d:Number, sa:Number, a2i:Number;
while (max_i--) {
d=Math.sqrt(c+i*(b+a*i));
sa=Math.sqrt(a);
a2i=a*2*i;
f_l=(2*sa*(d*(b+a2i)-e*b)+(b*b-4*a*c)*(Math.log(2*e+b/sa)-Math.log(2*d+(b+a2i)/sa)))/(8*Math.pow(a, (3/2)));
if (Math.abs(f_l-t_l)<.000001) {
return i;
}
st /= 2;
i += f_l<t_l ? st : f_l>t_l ? -st : 0;
}
return i;
};
var f:Number = fn(ff);
var p0:Object = ln[0], p1:Object = ln[1], p2:Object = ln[2];
var e:Number = 1-f, ee:Number = e*e, ff:Number = f*f, b:Number = 2*f*e;
if (omit_rotation) {
return {_x:p2._x*ff+p1._x*b+p0._x*ee, _y:p2._y*ff+p1._y*b+p0._y*ee};
} else {
return {_x:p2._x*ff+p1._x*b+p0._x*ee, _y:p2._y*ff+p1._y*b+p0._y*ee, _rotation:Math.atan2(p0._y-p1._y+(2*p1._y-p0._y-p2._y)*f, p0._x-p1._x+(2*p1._x-p0._x-p2._x)*f)/(Math.PI/180)};
}
}
}
Попробуй, может поможет.
|