Графика

 
Все замечательно и просто опппупительно, особенно после метастока или румуса, но вот работа с графикой....... А так хочется , чтобы красиво с анимацией душа радости просит , сделайте плз , а то вроде не сложная задача по рисованию квадратиков подвешивает мой калькулятор на пару минут. Хотя еще теплится надежда кривизны рук , если так то прошу указать . Код скрипта прилагаю.
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
      struct s_ney
        {// структура описывающая нейрон 
            int      x,y ;//координаты положения нейрона на карте   
            color    clr;//в какой цвет покрасить нейрон
            int      mapX, mapY;// координаты привязки на карте визуализация 
            string   name;//имя графического обьекта OBJ_RECTANGLE_LABEL 
            double   out;// занчение выходного сигнала 
            double   sinaps[1];//синапс                 
        };
      long  ident=ChartID() ;// запоминаем идентификатор графика на который бросили скрипт 
      int   ImageW,ImageH ;//размерность карты в пикселях ширина высота
      int   sizeX,sizeY;// размер квадратика на карте, для отображения нейронов
      int   CelsX,CelsY;//размерность карты число столбцов число строк массив нейронов 
      s_ney Neyron[];// массив нейронов  
void OnStart()
  {
      ImageH=500;
      ImageW=500 ;
      CelsX=50 ;
      CelsY=50 ;
      ArrayResize(Neyron,CelsX*CelsY);// узнали кол-во нейронов на карте 
      sizeX=int(ImageW/CelsX) ;//
      sizeY=int(ImageH/CelsY);// узнали размер отображения по Х и по Y
      InitNeyron();// проинициализировали нейроны
      ShowMaping();//прорисовка карты в зависимости от значения синапса и таблицы цветов
  }
//=====================================================================================================
void InitNeyron()
   {// инициализация нейронов 
      int i,j;
      for( i=0;i<CelsY;i++)
        {
            for( j=0;j<CelsX;j++)
              {
               Neyron[i*CelsX+j].mapX=j*sizeX ;
               Neyron[i*CelsX+j].mapY=i*sizeY ;//координаты нейрона где он должен нарисоваться
               Neyron[i*CelsX+j].x=j ;
               Neyron[i*CelsX+j].y=i ;// установили координаты нейрона в карте 
               Neyron[i*CelsX+j].name="My"+IntegerToString(i*CelsX+j) ;//имя графического обьекта OBJ_RECTANGLE_LABEL   
               Neyron[i*CelsX+j].sinaps[0]=i*CelsX+j;//установили значение синапса  
              }
        }
   }
//=========================================================================================================
void  Show()
   {
      int size=ArraySize(Neyron);// узнали сколько всего нейронов необходимо нарисовать
      int i,j,nambObj;
      string name ;
      bool  presence;
      for(i=0;i<size ;i++)
         {// создаем или корректируем обьекты
            nambObj=ObjectsTotal(ident,0,OBJ_RECTANGLE_LABEL);// узнали сколько всего граф обьектов на графике
            presence=false;// первоначально предполагаем что на графике нейрон еще не нарисован
            for(j=0;j<nambObj;j++)
               {//ищем на графике нейрон и если он есть корректируем его граф отображение 
                  name=ObjectName(ident,j,0,OBJ_RECTANGLE_LABEL);// возвращаем имя выбранного обьекта 
                  if( name == Neyron[i].name)
                     {// нашли на графике нейрон на всякий случай корректируем его цвет  
                        presence=true;
                        ObjectSetInteger(ident,Neyron[i].name,OBJPROP_BGCOLOR,Neyron[i].clr);// корректировка цвета
                        ObjectSetInteger(ident,Neyron[i].name,OBJPROP_COLOR,Neyron[i].clr);//
                        break ;
                     }  
               }
            if(!presence)
               {// этого нейрона на карте нет необходимо его создать
                  ObjectCreate(ident,Neyron[i].name,OBJ_RECTANGLE_LABEL,0,0,0);//создали граф обьект нейрона 
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_BGCOLOR,Neyron[i].clr);// установка цвета
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_COLOR,Neyron[i].clr);//
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_BORDER_TYPE,BORDER_FLAT);//установка типа рамки
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_XDISTANCE,Neyron[i].mapX);//х координата прорисовки
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_YDISTANCE,Neyron[i].mapY);// y координата прорисовки
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_XSIZE,sizeX);// установка размера по х
                  ObjectSetInteger(ident,Neyron[i].name,OBJPROP_YSIZE,sizeY);// установка размера по y
               }
         }
   }
//=======================================================================================================
double RndValue(double mn,double mx)
   { // функция возвращает случайное значание из диапазона
      return(mn+((mx-mn)*MathRand()/32767));  
   }
//======================================================================================================
void  ShowMaping()
   {//назначение цвета каждому нейрону в зависимости от длины вектора синапса из таблицы цветов 
      double min,max,indiv,aaa ;
      bool  first=false ;
      int   size=ArraySize(Neyron);
      int   i,j,index,sizesinaps;
      color color_mass[54]=//таблица цветов
      {0x00000000,0x00090609,0x000D0B0D,0x00120F13,0x001C181D,0x00211E22,0x002B272C,0x00332F35,
       0x00342C38,0x00372D37,0x003A2938,0x003D2731,0x003C2828,0x003C3128,0x003D3C27,0x00363A29,
       0x002E3C28,0x0026442F,0x00263E3D,0x001D3647,0x00113253,0x000C2458,0x0006155E,0x00000064,
       0x00000080,0x0000008C,0x0000009B,0x00003DB9,0x000040C4,0x000044D2,0x00004BE8,0x000050F4,
       0x000657FF,0x002068FF,0x001562FF,0x001172F4,0x000971D9,0x000A7AEB,0x0064AEF9,0x001BAEF5,
       0x000AB1F1,0x001AD8F2,0x0021D9F3,0x0052E1F5,0x0033DCF4,0x0057E2F7,0x0061D1BB,0x0061D19E,
       0x0060D280,0x0072D88D,0x008BDEA2,0x00A6E6B8,0x00BBECC9,0x00C0E096
      };
      for(i=0;i<size ;i++)
         {// пробежали по всем нейронам нашли минимальные максимальные значения длин векторов синапса 
            sizesinaps=ArraySize(Neyron[i].sinaps) ;
            aaa=0 ;
            for(j=0;j<sizesinaps;j++)
               {//расчет длины вектора синапса 
                  aaa=aaa+pow(Neyron[i].sinaps[j],2) ;
               } 
            Neyron[i].out=sqrt(aaa);
            if(!first)
               {// это первый расчет длин векторов инициализируем им мин макс значения 
                  min=Neyron[i].out ;
                  max=Neyron[i].out ;
                  first=true ;
                  continue ;
               }
            if(min > Neyron[i].out) min=Neyron[i].out ;
            if(max < Neyron[i].out) max=Neyron[i].out ;
         }
      indiv=(max-min)/(ArraySize(color_mass)-1);// расчет шага квантования для присвоения цвета
      for(i=0 ;i< size ;i++)
         {// назначаем каждому нейрону цвет в зависимости от длины вектора из таблицы цветов 
            index=int((Neyron[i].out-min)/indiv) ;
            Neyron[i].clr=color_mass[index];
         }
         Show();//рисуем нейроны на графике (рисуем карту)
   }