Canvas - это круто! - страница 10

 
Реter Konow:

Спасибо, Николай. Я не забуду твоей жертвы! :)

Подколол :))
 
Easy Canvas
Easy Canvas
  • www.mql5.com
Данная библиотека и класс iCanvas упростит написание программ с применением Canvas. Вот пример простого индикатора с применением данной библиотеки и его демонстрация. Обратите внимание, что в данном примере в теле индикатора отсутствует функция обработки событий OnChartEvent. Но она также может и присутствовать. Особенности данной библиотеки...
 

Демонстрация простого морфинга bmp-растрового изображения.

//+------------------------------------------------------------------+
//|                                                        Morph.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                         https://www.mql5.com/ru/users/nikolay7ko |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Nikolay Semko"
#property link      "https://www.mql5.com/ru/users/nikolay7ko"
#property link      "SemkoNV@bk.ru"  
#property version   "1.01"
#property indicator_chart_window
#define protected public
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#undef protected
#resource  "\\Images\\wave02.bmp"
#resource  "\\Images\\stone2.bmp"

input int MorphPeriod=3000; // период морфинга в миллисекундах 

string bmp1="::Images\\wave02.bmp";
string bmp2="::Images\\stone2.bmp";
int width_bmp1,height_bmp1;
int width_bmp2,height_bmp2;
uint BMP1[],BMP2[],scr1[],scr2[];
int N;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   if(!ResourceReadImage(bmp1,BMP1,width_bmp1,height_bmp1)) Print("Error read resource: ",GetLastError()); //  bmp file to array BMP1[]
   if(!ResourceReadImage(bmp2,BMP2,width_bmp2,height_bmp2)) Print("Error read resource: ",GetLastError()); //  bmp file to array BMP2[]
   ResourceFree(bmp1);
   ResourceFree(bmp2);
   BackGraundBmp(BMP1,Canvas,width_bmp1,height_bmp1);
   ArrayCopy(scr1,Canvas.m_pixels);
   BackGraundBmp(BMP2,Canvas,width_bmp2,height_bmp2);
   ArrayCopy(scr2,Canvas.m_pixels);
   EventSetMillisecondTimer(30);
   N=MorphPeriod/32;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   static long j=0;
   static int w=Canvas.m_width;
   static int h=Canvas.m_height;
   if(w!=Canvas.m_width || h!=Canvas.m_height) // если изменился размер окна, то перерисовываем фон
     {
      BackGraundBmp(BMP1,Canvas,width_bmp1,height_bmp1);
      ArrayCopy(scr1,Canvas.m_pixels);
      BackGraundBmp(BMP2,Canvas,width_bmp2,height_bmp2);
      ArrayCopy(scr2,Canvas.m_pixels);
      w=Canvas.m_width;
      h=Canvas.m_height;
     }
   long k=j%(2*N);
   k=(k<N)?k:(2*N-1-k);
   Morph(Canvas,scr1,scr2,k/double(N));
   Canvas.Update();
   j++;
  }
//+------------------------------------------------------------------+
void BackGraundBmp(uint &arr[],iCanvas &C,int &w,int &h)
  {
   int SizeArr=w*h;
   int pos=0,posBMP=0;
   int len=(C.m_width<w)?C.m_width:w;
   while(pos<(C.m_width*C.m_height))
     {
      int X=0;
      while(X<C.m_width)
        {
         int Len=C.m_width-X;
         if(Len>len) Len=len;
         ArrayCopy(C.m_pixels,arr,pos+X,posBMP,Len);
         X+=len;
        }
      pos+=C.m_width;
      posBMP+=w;
      if(posBMP>=SizeArr) posBMP=0;
     }
  }
//+------------------------------------------------------------------+

void Morph(iCanvas &C,uint &arr1[],uint &arr2[],double p) // p  - 0..1, размеры массивов arr1, arr2 и m_pixels должны быть одинаковые
  {
   argb pix,pix1,pix2;
   int size=ArraySize(Canvas.m_pixels);
   for(int i=0; i<size;i++)
     {
      pix1.clr=arr1[i];
      pix2.clr=arr2[i];
      pix.c[0]=pix1.c[0]+(uchar)Round(((int)pix2.c[0]-(int)pix1.c[0])*p);
      pix.c[1]=pix1.c[1]+(uchar)Round(((int)pix2.c[1]-(int)pix1.c[1])*p);
      pix.c[2]=pix1.c[2]+(uchar)Round(((int)pix2.c[2]-(int)pix1.c[2])*p);
      pix.c[3]=255;
      C.m_pixels[i]=pix.clr;
     }
  }
//+------------------------------------------------------------------+
Большая просьба не писать комментарии что-то вроде: как это влияет на торговлю? как это может пригодиться? и т.д.
Подобные комментарии в ветке, где демонстрируются возможности канваса, лично мной по меньшей мере будут восприниматься, как проявление непрофессионализма.
Файлы:
Morph.ZIP  738 kb
 
Nikolai Semko:
 Подобные комментарии в ветке, где демонстрируются возможности канваса, лично мной по меньшей мере будут восприниматься, как проявление непрофессионализма.

LOL

Я, как непрофессионал, лишь могу подтвердить - выглядит здорово.  Но, куда все это применить - мне непонятно. Вступаем в клуб Peter'a Konov'a.

 
Nikolai Semko:

Демонстрация простого морфинг bmp-растрового изображения.

Большая просьба не писать комментарии что-то вроде: как это влияет на торговлю? как это может пригодиться? и т.д.
Подобные комментарии в ветке, где демонстрируются возможности канваса, лично мной по меньшей мере будут восприниматься, как проявление непрофессионализма.

Не, ну это не морфинг. Морфингом с натяжкой можно это назвать:


А вообще, лень было делать самому настоящий - нашёл в папках примеров.

 
Artyom Trishkin:

Не, ну это не морфинг. Морфингом с натяжкой можно это назвать:


А вообще, лень было делать самому настоящий - нашёл в папках примеров.

А вот здесь то где морфинг? Оно, конечно, в данном случае не принципиально для наших задач, но все таки. Определение морфинга из Вики:

Морфинг (англ. morphing, трансформация) — технология в компьютерной анимации, визуальный эффект, создающий впечатление плавной трансформации одного объекта в другой.

Все таки первый пример в большей степени похож на данный эффект, имхо.

 
Andrei Novichkov:

А вот здесь то где морфинг? Оно, конечно, в данном случае не принципиально для наших задач, но все таки. Определение морфинга из Вики:

Морфинг (англ. morphing, трансформация) — технология в компьютерной анимации, визуальный эффект, создающий впечатление плавной трансформации одного объекта в другой.

Все таки первый пример в большей степени похож на данный эффект, имхо.

Где в первом примере плавная трансформация? Во втором как раз всё полностью плавно трансформируется в каждом кадре из одной формы в другую (морфинг). А в первом просто смена изображений с затуханием и наплывом. Хотел сделать сам морфинг лица из человеческого в какого-нибудь зверя, но не стал время тратить. Уж мне-то, ранее работавшему на тв, и делавшему рекламные ролики в 3D Studio MAX не стоит рассказывать про морфинг :)

 

А я тоже умею работать в Максе )))) И не только в нем )) И тоже работавшему с телевидением. Один из докум. фильмов, к которому я делал заставку не давно премию получил )

Конечно, наивно было бы считать первый пример морфингом в полном понимании этого слова. Но Артем, все таки колыхание юбки у девушки тоже не совсем то. Не до морфинг ) Вот если бы юбка у нее превращалась ммммм в слона, вот это другое дело ))))))

 
Andrei Novichkov:

А я тоже умею работать в Максе )))) И не только в нем )) И тоже работавшему с телевидением. Один из докум. фильмов, к которому я делал заставку не давно премию получил )

Конечно, наивно было бы считать первый пример морфингом в полном понимании этого слова. Но Артем, все таки колыхание юбки у девушки тоже не совсем то. Не до морфинг ) Вот если бы юбка у нее превращалась ммммм в слона, вот это другое дело ))))))

:)

Так я и сказал - "с натяжкой". Но речь-то не о юбке шла, где колыхание наверняка уже просчитано заранее (не глядел чем), а о самой болванке - ведь движения можно делать различными способами, в том числе и модификатором "Морфинг", что и будет именно морфингом. Но там наверное бипедом двигают - фигзнает, не глядел.

 
Artyom Trishkin:

:)

Так я и сказал - "с натяжкой". Но речь-то не о юбке шла, где колыхание наверняка уже просчитано заранее (не глядел чем), а о самой болванке - ведь движения можно делать различными способами, в том числе и модификатором "Морфинг", что и будет именно морфингом. Но там наверное бипедом двигают - фигзнает, не глядел.

Мне че та вообще сдается, что это не Макс. Как там эта прога для моделирования одежды?

Движения модели сделали хорошо, то, как она идет. Может и просто девочку датчиками облепили. А вот движения руками, как мне кажется, не доработали и получилось, как будто культурист идет мобилы отжимать ))

Ну и саму модель можно было бы посимпатичнее сделать. Это же какой то каннибал из "Зова Ктулху".

Нафлудили от души )))). Наверное заканчивать стоит.

Причина обращения: