帆布很酷! - 页 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;
     }
  }
//+------------------------------------------------------------------+
请不要写评论,如:它对交易有什么影响? 它有什么用? 等等。
这样的评论在支部,显示了Kanvas的能力,我个人,至少,会被认为是不专业的表现。
附加的文件:
Morph.ZIP  738 kb
 
Nikolai Semko:
在一个展示kanvas能力的主题中发表这样的评论,就我个人而言,至少会被认为是一种不专业的表现。

大笑

我作为一个门外汉,只能确认它看起来很好,但我不知道该在哪里应用这一切。让我们加入彼得- 科诺夫 的俱乐部。

 
Nikolai Semko:

示范一个简单的bmp光栅图像变形。

请不要写评论,如:这对交易有什么影响? 怎么可能有用?
在一个展示Kanvas能力的分支机构,这种评论,我个人认为,至少会被认为是不专业的表现。

不,那不是变形。称之为变形是一种延伸。


一般来说,我懒得自己做一个真正的--我在文件夹里找到了例子。

 
Artyom Trishkin:

不,那不是变形。说它是变形的,是一种延伸。


实际上,我太懒了,没有自己做一个真正的东西--我在例子文件夹里找到了它。

这里的变形在哪里?当然,在这种情况下,它对我们的目的并不关键,但仍然是。维基对变形的定义。

变形 计算机动画 中的一项技术,是一种视觉效果,可以创造出一个物体顺利转化为另一个物体的印象。

不过,第一个例子更像是这种效果,我认为。

 
Andrei Novichkov:

这里的变形在哪里?当然,这对我们在这里的目的并不关键,但仍然是。维基对变形的定义。

变形 计算机动画 中的一项技术,是一种视觉效果,它创造了一个物体顺利转化为另一个物体的印象。

第一个例子更类似于这种效果,我认为。

在第一个平滑变换 的例子中,在哪里?在第二种情况下,一切都在每一帧中完全平稳地从一种形式转变为另一种形式(变形)。而在第一张中,它只是一个有褪色和膨胀的图像变化。我想做面部变形,从人类变成某种野兽,但我不想浪费我的时间。我,曾经在电视上工作,用3D Studio MAX制作广告,不应该知道变形的事情:)

 

而且我也知道如何在Max中工作 ))))而且不仅仅是在里面))。我也曾与电视台合作。我为之制作的一部纪录片不久前获得了一个奖项)。

当然,如果认为第一个例子是完全意义上的变形,那就太天真了。但是,Artem,拨弄一个女孩的裙子并不完全是一回事。不是预变形 )如果只是她的裙子变成大象,那就不一样了))))))。

 
Andrei Novichkov:

而且我也知道如何在Max中工作 ))))而且不仅仅是在里面))。我也曾与电视台合作。不久前,我所做的一部纪录片的编剧获得了一个奖项))

当然,如果认为第一个例子是完全意义上的变形,那就太天真了。但是,Artem,拨弄一个女孩的裙子并不完全是一回事。不是预变形)如果她的裙子变成嗯嗯的大象就好了,那就另当别论了))))))。

:)

我就是这么说的,有点牵强。但我说的不是裙子,那里的波纹可能已经预先计算好了(我没看),而是假人本身--你可以让它以不同的方式移动,包括用 "变形 "修改器,这将只是变形。但他们可能会移动两足动物--我不知道,我没有看。

 
Artyom Trishkin:

:)

我就是这么说的,有点牵强。但我说的不是裙子,那里的摆动可能已经预先计算好了(我没看),而是假人本身--你可以让它以不同的方式移动,包括用 "变形 "修改器,这将只是变形。但他们可能会移动两足动物--我不知道,我没有看。

我认为这根本不是马克斯。那个服装建模软件怎么样了?

模特的动作很好,她走路的样子。也许这只是一个被传感器覆盖的女孩。但在我看来,手臂的动作还没有完成,结果就像健美运动员去推开一个移动的东西))。

模型本身可以更好看一点。这是 "魔神的召唤 "中的某种食人族。

大声而清晰的))))。我们也许应该把这个问题解决了。