Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите pls разобраться с Iv'овским Path'ем. (http://www.flasher.ru/forum/showthread.php?t=83832)

: hr : 17.08.2006 13:33

Помогите pls разобраться с Iv'овским Path'ем.
 
Вложений: 1
Друзья, помогите пожалуйста разобраться с классом Path от Iv'а. (исходник приложен). Проблема в том, что один экземпляр класса работает корректно, а если добавить второй - начинается ерунда (в исходнике этот фрагмент закомментирован). Ума не приложу что делать...

pkfun 17.08.2006 13:47

А сам автор чего говорит? Этот Iv, он же вроде здесь на форуме бывает. :D

etc 17.08.2006 14:06

Код:

/*
В© 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)};
                }
               
        }
}

Попробуй, может поможет.

: hr : 17.08.2006 14:20

__etc , спасибо! помогло.. щас буду разбираться что ты там исправил :) спасибо!


Часовой пояс GMT +4, время: 00:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.