zagPravAS3
Класс GrafikDesign Скачать пакет классов classyComponent
Класс GrafikDesign один из двух пользовательских классов анписанных для проекта "График". Его задача отрисовывать изображение графика. Класс включает в себя два public метода grafikLine1 и visiblNotGrafik. Первый метод собственно отрисовывает график, второй делает невидимыми все объекты отрисованные первым методом. Второй метод работает при задании нового диапазона выборки на уже отрисованном графике.
Посмотреть на работу графика можно здесь - смотреть.
Всё что отрисовано в верхней части графика, за исключением механизма вывода нового диапазона выборки в его нижней части, является результатом работы данного класса.
Механизм вывода нового диапазона выборки результат работы другого класса RegPolzunok - смотреть.
package classyComponent{
    
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
    
    public class GrafikDesign extends MovieClip{
        
        // --- СВОЙСТВА КЛАССА --- ;
        public var objGr:Array;       /* Все объекты созданного графика */
        public var nstr:Array;        /* Двумерный массив параметров отображения графика --- */
        public var osnGr:MovieClip;   /* Мув.-основа графика, задает местопол. и разм. графика --- */
    /* ------------------------------------------------------------------------------------------- */
        // --- Массивы --- ;
        private var delG:Array;       /* Массив текстовых полей, делений по горизонтальной оси --- */
        private var delV:Array;       /* Массив текстовых полей, делений по вертикальной оси --- */
        private var perX:Array;       /* Коорд.X точек перелома графика и вывода клипа-подск. --- */
        private var perY:Array;       /* Коорд.Y точек перелома графика и вывода клипа-подск. --- */
        private var pdsT:Array;       /* Текст вывод.подсказки по схеме (верт.зн - гориз.зн) --- */
        private var pdsK:Array;       /* Кнопки-спрайты на изломе графика --- */
        // --- Строковые --- ;
        // --- Численные --- ;
        private var wdthRO:Number;    /* Ширина рабочей области графика */
        private var hghtRO:Number;    /* Высота рабочей области графика */
        private var otsROX:Number;    /* Отступ рабочей области от левого края */
        // ------ разметка вертикальной оси ------ ;
        private var minShY:Number;    /* MIN отметка на вертикальной шкале --- */
        private var wdNumY:Number;    /* Ширина обл.дел. по вертик. шкале(MAX значение delV) --- */
        private var shagDV:Number;    /* Шаг делений(координатной сетки) по вертикальной оси --- */
        // ------ разметка горизотальной оси ------ ;
        private var shagDG:Number;    /* Шаг делений(коорд. сетки) по горизонтальной оси --- */
        private var kolDGO:uint;      /* Количество делений по горизонтальной оси --- */
        private var hgDelX:Number;    /* Высота области делений по горизонтальной оси --- */
        // ------ разное ------ ;
        private var risOsi:Number = 3;/* Выход оси координатной сетки за ось(риска деления) --- */
        private var fonRO:Sprite;     /* Фон рабочей области --- */
        
        /* ФУНКЦИЯ-КОНСТРУКТОР. Аргументы: 1.MovieClip-основа графика, 2.Массив настроек.  */
        public function GrafikDesign(arg1:MovieClip, arg2:Array){
            osnGr = arg1;
            nstr = arg2;
        }
        /* -------------------------------------------------------------------------------------
                            МЕТОДЫ ВЫСТРАИВАНИЯ ГРАФИКОВ (public function)
        ---------------------------------------------------------------------------------------- */
        /* ГОРИЗОНТАЛЬНО-РАВНОМЕРНЫЙ ОДНОЛИНЕЙНЫЙ ГРАФИК. Аргументы: 1.Массив, значения откладываемые 
        по горизонтальной оси, 2.Массив зн.откл. по вертикальной оси. Метод возвращает массив. 
        Отстраивает график с полной амплитудой выводимых значений от MIN до MAX без "пустых" показат.
        областей сверху и снизу. Метод был опробован при выводе положительного(по вертикальной оси) 
        диапазона значений и отрицательно-положительного диапазона.                                */
        public function grafikLine1(arg1:Array, arg2:Array):Array{
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            arrVr1 = [osnGr.x, osnGr.y, osnGr.width, osnGr.height];
            rezult[0] = this.risPriamougolnik(nstr[1], arrVr1); // Отрисовка основного фона --- ;
            delV = this.textPolVertOsGraf(arg2);            // Текст.поля дел.верт.шкалы --- ;
            minShY = Number(delV[delV.length-1].text);      // MIN знач.по вертк.на РабОблГр ;
            rezult = rezult.concat(delV);
            wdNumY = this.maxWidthObject(delV);             // Ширина обл.дел.по верт.шкале --- ;
            wdthRO = this.widthROGraf();                    // Ширина рабочей области графика --- ;
            delG = this.textPolGorizOsGraf(arg1);           // Текст.поля дел.по гориз.шкале --- ;
            rezult = rezult.concat(delG);
            hgDelX = this.maxHeightObject(delG);            // Высота обл.дел.по гориз.оси --- ; 
            hghtRO = this.heightROGraf();                   // Высота РабОбл графика --- ;
            shagDV = hghtRO/(delV.length-1);                // Шаг деления по верт.оси --- ;
            otsROX = osnGr.width - (wdthRO + nstr[0][1]);   // Отступ РабОбл от левого края --- ;
            arrVr1 = [(osnGr.x+otsROX), (osnGr.y+nstr[0][2]), wdthRO, hghtRO];
            fonRO = this.risPriamougolnik(nstr[2], arrVr1); // Отрисовка фона рабочей области --- ;
            rezult.push(fonRO);
            arrVr1 = this.osyGrafik();                      // Отрисовка осей --- ;
            rezult = rezult.concat(arrVr1);
            rasstDelVertOs();                               // Расст.текст.полей по верт.оси --- ;
            rasstDelGorOs();                                // Расст.текст.полей по гориз.оси --- ;
            arrVr1 = [osnGr.x+otsROX-(risOsi+nstr[3][1]), (osnGr.y+nstr[0][2]+hghtRO), 
                      osnGr.x+otsROX-(risOsi+nstr[3][1]), osnGr.y+nstr[0][2]]; // Коорд.направл.;
            rezult[rezult.length] = this.cycleRisOtrezok(nstr[4], arrVr1, delV.length, 
                                    (wdthRO+risOsi+nstr[3][1]), shagDV); // Гориз.линии коорд.сетки;
            arrVr1 = [(osnGr.x+otsROX+wdthRO), (osnGr.y+nstr[0][2]+hghtRO+risOsi+nstr[3][1]), 
                      (osnGr.x+otsROX), (osnGr.y+nstr[0][2]+hghtRO+risOsi+nstr[3][1])];
            rezult[rezult.length] = this.cycleRisOtrezok(nstr[4], arrVr1, delG.length, 
                                    (hghtRO+risOsi+nstr[3][1]), shagDG); // Верт.линии коорд.сетки;
            arrVr1 = this.risLineGrafik(nstr[7],arg2,(osnGr.x+otsROX),(osnGr.y+nstr[0][2]+hghtRO),
                     minShY,Number(delV[0].text),wdthRO,hghtRO,arg1); // Отрисовка линии графика;
            rezult[rezult.length] = arrVr1[0];
            perX = arrVr1[1];                           // Коорд.X точек перелома графика --- ; 
            perY = arrVr1[2];                           // Коорд.Y точек перелома графика --- ;  
            pdsT = arrVr1[3];                           // Тексты выводимых подсказок --- ;
            pdsK = this.cycleRasstKnopok(textPolePodl); // Созд.и расст.кнопок на изломах лин.граф;
            rezult = rezult.concat(pdsK);
            objGr = rezult.slice(0);
            for(var i:uint=0; i<rezult.length; i++){
                addChild(rezult[i]);
            }
            return rezult;
        }

        /* УДАЛЕНИЕ ВИДИМОСТИ СОЗДАННЫХ ОБЪЕКТОВ ГРАФИКА. */
        public function visiblNotGrafik():void{
            for(var i:uint=0; i<objGr.length; i++){
                objGr[i].visible = false;
            }
        }
        
        
        
        

        /* -----------------------------------------------------------------------------------------
                            ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ (private function)
        ----------------------------------------------------------------------------------------- */
        /* ШИРИНА РАБОЧЕЙ ОБЛАСТИ ГРАФИКА */
        private function widthROGraf():Number{
            var rezult:Number;
            rezult = osnGr.width - (nstr[0][0] + wdNumY + nstr[0][7] + risOsi + nstr[3][1]
                                    + nstr[0][1]);
            return rezult;
        }
        /* ВЫСОТА РАБОЧЕЙ ОБЛАСТИ ГРАФИКА */
        private function heightROGraf():Number{
            var rezult:Number;
            rezult = osnGr.height - (nstr[0][2] + nstr[3][1] + risOsi + nstr[0][6] + hgDelX
                                     + nstr[0][3]);
            return rezult;
        }
        /* ТЕКСТОВЫЕ ПОЛЯ ВЕРТИКАЛЬНОЙ ШКАЛЫ. Аргумент: Массив зн.откл. по вертикальной оси. */
        private function textPolVertOsGraf(arg1:Array):Array{
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            arrVr1 = this.minMaxArray1(arg1);
            arrVr1 = this.numDelShkala(arrVr1[0], arrVr1[1], nstr[0][5]);
            arrVr1 = this.uravnDrobnoyChasti(arrVr1);
            rezult = this.arrTextPoleLat(nstr[6], arrVr1, 0); 
            return rezult;
        }
        /* ТЕКСТОВЫЕ ПОЛЯ ГОРИЗОНТАЛЬНОЙ ШКАЛЫ. Аргумент: Массив зн.откл. по горизонтальной оси. */
        private function textPolGorizOsGraf(arg1:Array):Array{
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            arrVr1 = this.razmetGorizOsi(arg1, wdthRO, nstr[0][4]);
            kolDGO = arrVr1[0];
            shagDG = arrVr1[1];
            rezult = this.arrTextPoleLat(nstr[5], arrVr1[3], 270);
            return rezult;
        }
        /* ОТРИСОВКА ОСЕЙ */
        private function osyGrafik():Array{
            var rezult:Array = new Array();
            var numVr1:Number;
            var numVr2:Number;
            var numVr3:Number;
            var numVr4:Number;
            numVr1 = (osnGr.x + otsROX) - nstr[3][1]/2; //
            numVr2 = osnGr.y + nstr[0][2] + hghtRO + nstr[3][1]/2;
            numVr3 = osnGr.y + nstr[0][2];
            rezult[0] = this.risOtrezok(nstr[3], numVr1, numVr2, numVr1, numVr3);
            numVr3 = numVr1 + wdthRO + nstr[3][1]/2;
            rezult[1] = this.risOtrezok(nstr[3], numVr1+nstr[3][1]/2, numVr2, numVr3, numVr2);
            return rezult;
        }
        /* РАССТАНОВКА ТЕКСТОВЫХ ПОЛЕЙ ПО ВЕРТИКАЛЬНОЙ ОСИ */
        private function rasstDelVertOs():void{
            var numVr1:Number = hghtRO/(delV.length - 1);
            for(var i:uint=0; i<delV.length; i++){
                delV[i].x = osnGr.x + nstr[0][0] + wdNumY - delV[i].width;
                delV[i].y = osnGr.y + nstr[0][2] + (i*numVr1) - (delV[i].height/2);
            }
        }
        /* РАССТАНОВКА ТЕКСТОВЫХ ПОЛЕЙ ПО ГОРИЗОНТАЛЬНОЙ ОСИ */
        private function rasstDelGorOs():void{
            for(var i:uint=0; i<delG.length; i++){
                delG[i].x = (osnGr.x + otsROX+ wdthRO) - (i*shagDG) - delG[i].width/2 ;
                delG[i].y = (osnGr.y + osnGr.height + delG[i].height) - (nstr[0][3] + hgDelX);
            }
        }
        // ------------------------------------------------------------------------------------- ;
        /* ---------------- РИСОВАНИЕ ФИГУР --------------------------------------------------- */
        /* ОТРИСОВКА ПРЯМОУГОЛЬНИКА. Аргументы: 1.Массив, стиль рисования фигуры*, 2.Массив где:
          [0][1] - Коорд.X,Y, [2][3]- Шир.и выс.прямоугольника. Функция возвр.объект Sprite    */
        private function risPriamougolnik(arg1:Array, arg2:Array):Sprite {
            var sprVr1:Sprite = new Sprite();
            sprVr1.graphics.lineStyle(arg1[3], arg1[2], arg1[4]);
            sprVr1.graphics.beginFill(arg1[0], arg1[1]);
            sprVr1.graphics.drawRect(arg2[0], arg2[1], arg2[2], arg2[3]);
            return sprVr1;
        }
        /* РИСОВАНИЕ ОТРЕЗКА - Аргументы: 1.Стиль рисования линии, 2,3.Координаты X1 и Y1 начала 
           отрезка, 4,5.Координаты X2 и Y2 конца отрезка. Функция возвращает объект Sprite */
        private function risOtrezok(arg1:Array, arg2:Number, arg3:Number, arg4:Number, 
                                    arg5:Number):Sprite{
            var rezult:Sprite = new Sprite();
            rezult.graphics.lineStyle(arg1[1], arg1[0], arg1[2]);
            rezult.graphics.moveTo(arg2, arg3);
            rezult.graphics.lineTo(arg4, arg5);
            return rezult;
        }
        /* ---------------- ТЕКСТОВЫЕ ПОЛЯ ------------------------------------------------------- */
        /* ОДНОСТРОЧНОЕ ТЕКСТОВОЕ ПОЛЕ НЕ ОТОБРАЖАЮЩЕЕ КИРИЛЛИЦУ - достоинством является возможность
           поворота и отображение встроенного шрифта. АРГУМЕНТЫ: 1.Стиль текстового поля*, 2.Строков.
           знач.присваиваемое текстовому полю, 3.Угол поворота поля. Данный метод не присваивает 
           координаты текстовому полю. Метод возвращает объект TextField.                          */
         private function textPoleLat(arg1:Array, arg2:String, arg3:Number):TextField{
            var txfVr1:TextField = new TextField();
            var txfVr2:TextFormat = new TextFormat();
            txfVr1.type = TextFieldType.DYNAMIC;
            txfVr1.autoSize = TextFieldAutoSize.LEFT;
            txfVr1.embedFonts = true;
            txfVr1.selectable = false;
            txfVr1.multiline = false;
            txfVr1.text = arg2;
            txfVr1.width = txfVr1.textWidth;
            txfVr1.height = txfVr1.textHeight;
            txfVr1.alpha = arg1[2];
            txfVr2.font = arg1[3];
            txfVr2.bold = true;
            txfVr2.size = arg1[0];
            txfVr2.color = arg1[1];
            txfVr1.setTextFormat(txfVr2);
            txfVr1.rotation = arg3;
            return txfVr1;
         }
         
         /* ПОЛУЧЕНИЕ МАССИВА ОДНОСТРОЧНЫХ ТЕКСТОВЫХ ПОЛЕЙ. Аргументы: 1.Стиль текстового поля*, 
            2.Массив строковых значений вводимых в текстовые поля, 3.Угол поворота текстовых полей.
            Метод не присваивает координат, возвращет массив.                                   */
         private function arrTextPoleLat(arg1:Array, arg2:Array, arg3:Number):Array{
             var rezult:Array = new Array();
             for(var i:uint=0; i<arg2.length; i++){
                 rezult[i] = this.textPoleLat(arg1, arg2[i], arg3);
             }
             return rezult;
         }
        
        /* ---------------- РАБОТА СО СТРОКАМИ -------------------------------------------------- */
        /* ПОИСК ЗНАКА В СТРОКЕ(одного,заданного). Аргументы: 1.Поисковый знак, 2.Строка. Возврашает
           true если знак есть и false если нет. Регистр букв играет роль.                        */
        private function strokaPoiskZnaka(arg1:String, arg2:String):Boolean {
            var rezult:Boolean = false;
            var arrVr1:Array = new Array;
            arrVr1 = arg2.split("");
            for (var i:uint=0; i<arrVr1.length; i++) {
                if (arrVr1[i] == arg1) {
                    rezult = true;
                }
            }
            return rezult;
        }
        /* ---------------- СОРТИРОВКА МАССИВОВ ------------------------------------------------- */
        /* ПОЛУЧЕНИЕ MAX ЗНАЧЕНИЯ ШИРИНЫ В МАССИВЕ ОБЪЕКТОВ. Аргумент: Массив объектов. Метод 
           возвращает значение MAX ширины в пикселах среди элементов массива.                     */
        private function maxWidthObject(arg1:Array):Number{
            var rezult:Number;
            rezult = arg1[0].width;
            for(var i:uint=0; i<arg1.length; i++){
                if(rezult < arg1[i].width){
                    rezult = arg1[i].width;
                }
            }
            return rezult;
        }
        /* ПОЛУЧЕНИЕ MAX ЗНАЧЕНИЯ ВЫСОТЫ В МАССИВЕ ОБЪЕКТОВ. Аргумент: Массив объектов. Метод 
           возвращает значение MAX высоты в пикселах среди элементов массива.              */
        private function maxHeightObject(arg1:Array):Number{
            var rezult:Number;
            rezult = arg1[0].height;
            for(var i:uint=0; i<arg1.length; i++){
                if(rezult < arg1[i].height){
                    rezult = arg1[i].height;
                }
            }
            return rezult;
        }
        
        /* ПОЛУЧЕНИЕ MIN И MAX ЗНАЧЕНИЙ МАССИВА . Аргумент: Массив чисел. Возвращает массив из 2 эл.
           [0]-MIN значение , [1]-MAX значение --- */
        private function minMaxArray1(arg1:Array):Array{
            var rezult:Array = new Array();
            var vrLog:Boolean = false;
            var vrMax:Number;
            var vrMin:Number;
            for(var i:uint=0; i<arg1.length; i++){
                if(arg1[i]!==null && vrLog == false){
                    vrMax = arg1[i];
                    vrMin = arg1[i];
                }
                if(arg1[i]!==null){
                    vrLog = true;
                }
            }
            for (i=0; i<arg1.length; i++) {
                if (arg1[i+1] >= vrMax) {
                    vrMax=arg1[i+1];
                }
                if (arg1[i+1] < vrMin && arg1[i+1] !== null) {
                    vrMin = arg1[i+1];
                }
            }
            rezult[0] = vrMin;
            rezult[1] = vrMax;
            return rezult;
        }
        /* ---------------- РАЗНОЕ ------------------------------------------------------------- */        
        /* УРАВНЕНИЕ ДРОБНОЙ ЧАСТИ ЧИСЕЛ. ДОПИСЫВАНИЕ НУЛЕЙ. Аргумент: массив чисел, возможно 
           содержащих точку. Если точки есть то требуется получить массив строковых значений где 
           количество знаков у всех элементов после точки было бы одинаково и равнялось наибольш.
           Возврашает массив строковых значений. */
        private function uravnDrobnoyChasti(arg1):Array {
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            var arrVr2:Array = new Array();
            var arrVr3:Array = new Array();
            var strVr3:String;
            var logVr1:Boolean = false;
            var logVr2:Boolean = false;
            // --- Механизм проверки наличия хотя бы одного числа с дробной частью --- ;
            for (var i:uint=0; i<arg1.length; i++) {
                strVr3=String(arg1[i]);
                logVr1 = this.strokaPoiskZnaka(".", strVr3);
                if (logVr1 == true) {
                    logVr2 = true;
                }
            }
            if (logVr2 == true) {       // --- Если есть хотя бы одно число с дробной частью --- ;
                for (i=0; i<arg1.length; i++) {
                    strVr3 = String(arg1[i]);
                    arrVr1 = strVr3.split(".");
                    strVr3 = arrVr1[1];
                    if (arrVr1[1] == null) {
                        arrVr2[i] = 0;
                    } else {
                        if (arrVr1[1] !== null) {
                            arrVr3 = String(arrVr1[1]).split("");
                            arrVr2[i] = arrVr3.length;
                        }
                    }
                }
                // Получили arrVr2 - массив чисел соотв количюзнаков после запятой (точки) --- ;
                arrVr1 = this.minMaxArray1(arrVr2);         
                for (i=0; i<arg1.length; i++) {
                    if (arrVr2[i] !== 0) {
                        strVr3 = String(arg1[i]);
                    }
                    if (arrVr2[i] == 0) {
                        strVr3=String(arg1[i])+".";
                    }
                    for (var k:uint=arrVr2[i]; k<arrVr1[1]; k++) {
                        strVr3 += "0";
                    }
                    rezult.push(strVr3);
                }
            }
            if (logVr2==false) {             // --- Если нет ни одного числа с дробной частью --- ;
                for (i=0; i<arg1.length; i++) {
                    rezult[i] = String(arg1[i]);
                }
            }
            return rezult;// --- Получили массив с текстовыми значениями с "дописанными нулями" --- ;
        }
        
        /* ПОЛУЧЕНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ ДЕЛЕНИЙ НА ШКАЛЕ. Аргументы: 1.MIN значение на графиках, 
           2.MAX значение на графиках, 3.Примерное MAX число делений. Этот метод выводит только числа
           которые обозначают то или иное значение. Однако в  ряду значений делений могут встречаться
           численные значения с дробной частью при чем количество знаков после точки будет разным и 
           при выводе этого ряда на шкалу будет нарушаться эстетика отображения графика. 
           Для "дописывания нулей" применяется метод uravnDrobnoyChasti. ------------------------- */
        private function numDelShkala(arg1:Number, arg2:Number, arg3:Number):Array {
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            arrVr1 = [0.001,0.01,0.1,1,10,100,1000,10000,100000,1000000,10000000,100000000];
            var arrVr2:Array = new Array();
            arrVr2 = [1, 2.5, 5];
            var numVr1:Number;
            var numVr2:Number;
            var numVr3:Number;
            var numVr4:Number;
            var numVr5:Number;
            var numVr6:Number;
            var numVr7:Number;
            var logVr1:Boolean = false;
            numVr1 = arg2 - arg1;
            for(var i:uint=0; i<arrVr1.length; i++) {
                for(var k:uint=0; k<arrVr2.length; k++) {
                    numVr4 = arrVr1[i]*arrVr2[k];
                    numVr5 = numVr1/numVr4;
                    numVr6 = Math.floor(numVr5)+2;
                    if (logVr1 == false) {
                        if (numVr6 <= (arg3+1)) {
                            logVr1 = true;
                            numVr2 = numVr4;
                            numVr3 = numVr6;
                            numVr7 = numVr2*(Math.floor(arg2/numVr2)+1);
                        }
                    }
                }
            }
            for (i=0; i<numVr3; i++) {
                rezult[i] = numVr7 - (numVr2*i);
            }
            if (rezult[(numVr3-1)] > arg1) {
                rezult.push(String(rezult[(numVr3-1)]-numVr2));
            }
            return rezult;  // Получили массив с ЧИСЛОВЫМИ знач.всех делений на вертик.оси Y --- ;
        }
        
        /* КОЛИЧЕСТВО ДЕЛЕНИЙ И ШАГ ДЕЛЕНИЯ ПО ГОРИЗОНТАЛЬНОЙ ОСИ. Аргументы: 1.Массив значений 
           откладываемых по горизонтальной оси, 2.Ширина рабочей области графика, 3.MAX количество
           делений по горизонтальной оси. Метод возвращает двумерный массив где:[0]-Количество 
           делений по горизонтальной оси, [1]-Шаг вывода деления(пкс), [2]-Логический параметр 
           который говорит о том надо ли выводить еще одну дополнительную замыкающую линию коорд.
           сетки true-ДА, false-НЕТ, [3]-Массив выводимых на горизонтальную ось значений. */
        private function razmetGorizOsi(arg1:Array, arg2:Number, arg3:Number):Array{
            var rezult:Array = new Array();
            var arrVr1:Array = new Array();
            var numVr1:Number;
            var numVr2:Number;
            var numVr3:Number;
            arg3=arg3-1;                        // MAX допустимое количество отрезков на оси X ;
            numVr1 = (arg1.length-1)/arg3;      // Соотношение реального к допустимому --- ;
            if(numVr1 <= 1){
                rezult[0] = arg1.length;
                rezult[1] = arg2/(arg1.length-1);
                rezult[2] = false;
                numVr2 = 1;
            }
            if(numVr1 > 1){
                numVr2 = Math.floor(numVr1)+1;  // Количество дат в одном диапазоне вывода дат ;
                rezult[0] = Math.floor((arg1.length-1)/numVr2)+1;
                if(((arg1.length-1)/numVr2) == Math.floor((arg1.length-1)/numVr2)){
                    rezult[2] = false;
                }else{
                    rezult[2] = true;
                }
                rezult[1] = (arg2/(arg1.length-1))*numVr2;
            }
            numVr3 =0;
            for(var i:uint=0; i<arg1.length; i=i+numVr2){ 
                arrVr1.push(arg1[(arg1.length-1)-i]);
            }
            rezult[3] = new Array();
            rezult[3] = arrVr1;
            return rezult;
        }
        
        /* ЦИКЛИЧЕСКОЕ РИСОВАНИЕ ОТРЕЗКОВ (отрезки параллельные, одинаковой заданной длины через
           заданный шаг от направляющей перпендикулярно вправо). Аргументы: 1.Стиль рисования линии,
           2.Координаты направления(см.пояснения), 3.Количество отрисовываемых отрезков, 4.Длина
           отрезков, 5.Шаг рисования. Использование метода: а.Координатами (arg2) задается направл.,
           б.По заданному направлению из точки начала от направляющей перпендикулярно вправо через
           шаг(arg5)будут откладываться отрезки длиной (arg4). Число откладываемых от направляющей
           перпендикулярных отрезков -(arg2).                                                    */ 
        public function cycleRisOtrezok(arg1:Array, arg2:Array, arg3:Number, arg4:Number, 
                                        arg5:Number):Sprite{
            var rezult:Sprite = new Sprite();
            rezult.graphics.lineStyle(arg1[1], arg1[0], arg1[2]);
            var numVr1:Number; 
            var numVr2:Number;
            var numVr3:Number;
            var numVrx:Number;
            var numVry:Number;
            var numVrX:Number;
            var numVrY:Number;
            var numVr4:Number;
            var numVr5:Number;
            var numVr6:Number;
            var numVr7:Number;
            if(arg2[0] > arg2[2] && arg2[1] == arg2[3]){
                arg5 = -arg5;
            }
            if(arg2[0] == arg2[2] && arg2[1] > arg2[3]){
                arg5 = -arg5;
                arg4 = -arg4;
            }
            if(arg2[0] < arg2[2] && arg2[1] == arg2[3]){
                arg4 = -arg4;
            }
            numVr1=Math.sqrt(((arg2[0]-arg2[2])*(arg2[0]-arg2[2]))
                             +((arg2[1]-arg2[3])*(arg2[1]-arg2[3])));
            numVr2=Math.sqrt((arg2[0]-arg2[2])*(arg2[0]-arg2[2]));
            numVr3=Math.sqrt((arg2[1]-arg2[3])*(arg2[1]-arg2[3]));
            numVrx=(arg5/numVr1)*numVr2;
            numVry=(arg5/numVr1)*numVr3;
            numVrY=(arg4/numVr1)*numVr2;
            numVrX=(arg4/numVr1)*numVr3;
            // ------- Отрисовка отрезков ------------------------------------- ;
            for(var i:uint; i<arg3; i++){
                numVr4 = arg2[0]+(i*numVrx);
                numVr5 = arg2[1]+(i*numVry);
                numVr6 = arg2[0]-numVrX+(i*numVrx);
                numVr7 = arg2[1]-numVrY+(i*numVry);
                if(arg2[2] > arg2[0] && arg2[3] > arg2[1]){
                     numVr7 = arg2[1]+numVrY+(i*numVry);
                }
                if(arg2[2] < arg2[0] && arg2[3] < arg2[1]){
                    numVr4 = arg2[0]-(i*numVrx);
                    numVr5 = arg2[1]-(i*numVry);
                    numVr6 = arg2[0]+numVrX-(i*numVrx);
                    numVr7 = arg2[1]-numVrY-(i*numVry);
                }
                if(arg2[2] > arg2[0] && arg2[3] < arg2[1]){
                    numVr5 = arg2[1]-(i*numVry);
                    numVr6 = arg2[0]+numVrX+(i*numVrx);
                    numVr7 = arg2[1]+numVrY-(i*numVry);
                }
                if(arg2[2] < arg2[0] && arg2[3] > arg2[1]){
                    numVr4 = arg2[0]-(i*numVrx);
                    numVr6 = arg2[0]-numVrX-(i*numVrx);
                }
                rezult.graphics.moveTo(numVr4, numVr5);
                rezult.graphics.lineTo(numVr6, numVr7);
            }
            return rezult;
        }
        
        /* РИСОВАНИЕ ЛИНИИ ГРАФИКА. Аргументы:1.Стиль линии графика , 2.Массив с выводимыми по верт.
           оси значениями (все значения тип Number), Координаты начала графика :(3.Координата X , 
           4.Координата Y - имеется ввиду значения координат 0,0 на самом графике), 5.MIN значение 
           деления по вертикальной оси, 6.MAX знач.деления по вертикальной оси, 7.Ширина рабочей 
           области графика, 8.Высота рабочей области графика, 9.Массив зн. отклад. по горизонтальн.
           оси(имеются ввиду все значения и не значения делений по гориз.оси). Метод возвр. двумерн.
           массив где : 
           [0]-Объект Sprite, [1]-массив реальных координат(точек перелома линии)по оси X, [2]-масс.
           реальных коорд.по оси Y, [3]-массив со строковыми знач. выводим.данных(текста подск.) */
        private function risLineGrafik(arg1:Array, arg2:Array, arg3:Number, arg4:Number, arg5:Number,
                                       arg6:Number, arg7:Number, arg8:Number, arg9:Array):Array{
            var rezult:Array = new Array();
            rezult[0] = new Sprite();
            rezult[1] = new Array(); // Возвращает массив реальных координат по оси X ;
            rezult[2] = new Array(); // Возвращает массив реальных координат по оси Y ;
            rezult[3] = new Array(); // Возвр.массив со строковыми значениями выводимых данных ; 
            var numVr1:Number;
            var numVr2:Number;
            var numVr3:Number;
            var numVr4:Number;
            var numVr5:Number;
            var numVr6:Number;
            // --- Получение значений необходимых в расчете --- ;
            numVr1 = (arg6 - arg5)/arg8;             // --- Удельный вес значений по высоте --- ;
            numVr2 = arg7/(arg2.length-1);           // --- Шаг вывода значений --- ;
            rezult[0] .graphics.lineStyle(arg1[1], arg1[0], arg1[2]);
            for(var i:uint=0; i<arg2.length-1; i++){
                if(arg2[i] !== null){
                    numVr3 = arg3+(numVr2*i);
                    numVr4 = arg3+(numVr2*(i+1));
                    numVr5 = arg4-((arg2[i]-arg5)/numVr1);
                    numVr6 = arg4-((arg2[i+1]-arg5)/numVr1);
                    if(arg2[i] !== null && arg2[i+1] !== null){
                        rezult[0] .graphics.moveTo(numVr3, numVr5);
                        rezult[0] .graphics.lineTo(numVr4, numVr6);
                    }
                    rezult[1].push(numVr3);
                    rezult[2].push(numVr5);
                    //rezult[3].push(String(arg2[i])+" - "+arg9[(arg9.length-1)-i]);
                    rezult[3].push(String(arg2[i])+" - "+arg9[i]);
                }
            }
            if(arg2[arg2.length-1] !== null){
                rezult[1].push(numVr4);
                rezult[2].push(numVr6);
                rezult[3].push(String(arg2[arg2.length-1]+" - "+arg9[arg2.length-1]));
            }
            return rezult;
        }
        
        /* КРУГЛАЯ КНОПКА ОТРАБАТЫВАЮЩАЯ ФУНКЦИЮ ДЛЯ СОБЫТИЙ OVER, OUT, UP. Аргументы: 1.Стиль 
           кнопки (круг), 2.Координата X кнопки, 3.Координата Y. 4.Массив из 3 функций, 5.Двумерн.
           массив аргументов. Метод возвращает Sprite - объект представляющий кнопку.*/
        private function knopPodskazka(arg1:uint, arg2:Function):Sprite {
            var rezult:Sprite = new Sprite();
            var arrVr1:Array = new Array();
            rezult.graphics.lineStyle(nstr[8][3], nstr[8][2], nstr[8][4]);
            rezult.graphics.beginFill(nstr[8][0], nstr[8][1]);
            rezult.graphics.drawCircle(perX[arg1], perY[arg1], nstr[8][5]);
            rezult.addEventListener(MouseEvent.MOUSE_OVER, knopOVER);
            rezult.addEventListener(MouseEvent.MOUSE_OUT, knopOUT);
            function knopOVER(sob:Event):void{
                arrVr1 = arg2(arg1);
                addChild(arrVr1[0]);
                addChild(arrVr1[1]);
            }
            function knopOUT(sob:Event):void{
                arrVr1[0].graphics.clear();
                arrVr1[0].visible = false;
                arrVr1[1].visible = false;
            }
            return rezult;
        }
        
        /* ЦИКЛИЧЕСКАЯ РАССТАНОВКА КНОПОК НА ОДНОЛИНЕЙНОМ ГРАФИКЕ. 1.Стиль кнопки, 2.Массив коорд.X
           кнопок(perX), 3.Массив  координат Y кнопок(perY). Метод возвращает массив объектов Sprite
           - кнопок на линиях графика. */
        private function cycleRasstKnopok(arg1:Function):Array{
            var rezult:Array = new Array();
            for(var i:uint=0; i
 (osnGr.x+otsROX+fonRO.width)){
                numVr1 = (osnGr.x+otsROX+fonRO.width) - numVr3;
            }
            if(numVr2 < osnGr.y+nstr[0][2]){
                numVr2 = numVr2+numVr4+2*nstr[9][11]+2*nstr[8][5];
            }
            sprVr1.graphics.lineStyle(nstr[9][7], nstr[9][6], nstr[9][8]);
            sprVr1.graphics.beginFill(nstr[9][4], nstr[9][5]);
            sprVr1.graphics.drawRect(numVr1, numVr2, numVr3, numVr4);
            txfVr1.x = numVr1 + nstr[9][9];
            txfVr1.y = numVr2 + nstr[9][10];
            rezult[0] = sprVr1;
            rezult[1] = txfVr1;
            return rezult;
        }

        
    }
}
/*   ПОЯСНЕНИЯ:
     а.Цвет: 16-тиричное число,
     б.Плотность: значение от 0 до 1,
     в.Толшина: указывается в пикселях,
     г.Координаты: указываются в пикселях,
     д.Размер шрифта: указывается в пикселях.
   1.СТИЛЬ РИСОВАНИЯ ФИГУРЫ - массив, где: 
       [0]- Цвет заливки фигуры --- ;
       [1]- Плотность заливки фигуры --- ;
       [2]- Цвет обводки фигуры --- ;
       [3]- Толщина обводки фигуры --- ;
       [4]- Плотность линии обводки фигуры --- ;
   2.СТИЛЬ ТЕКСТОВОГО ПОЛЯ - массив, где:
       [0]- Размер текста --- ;
       [1]- Цвет текста --- ;
       [2]- Плотность текста --- ;
       [3]- Имя встроенного шрифта --- ;
   3.СТИЛЬ РИСОВАНИЯ ЛИНИИ - массив, где:
       [0]- Цвет линий --- ;
       [1]- Толщина линий --- ;
       [2]- Плотность линий --- ;
   4.КООРДИНАТЫ НАПРАВЛЕНИЯ - массив из 4 эл.где:
       [0],[1]-Координаты X,Y начальной точки направляющей --- ;
       [2],[3]-Координаты X,Y конечной точки направляющей --- ;
   5.СТИЛЬ ВСПЛЫВАЮЩЕЙ ПОДСКАЗКИ - массив, где:
       [0]- Размер текста --- ;
       [1]- Цвет текста --- ;
       [2]- Плотность текста --- ;
       [3]- Имя встроенного шрифта --- ;
       [4]- Цвет фона подсказки --- ;
       [5]- Плотность фона --- ;
       [6]- Цвет обводки фона --- ;
       [7]- Толщина обводки --- ;
       [8]- Плотность обводки --- ;
       [9]- Расст.по горизонтали от края подложки до текста подсказки --- ;
       [10]- Расст.по вертикали от края подложки до текста подсказки --- ;
       [11]- Пробел по вертикали от края кнопки до начала подложки --- ;
*/