Tuval harika!

 

Kendime CCanvas sınıfı aracılığıyla kısa bir kod kullanarak özel grafiklerin yeteneklerini etkili bir şekilde gösterme görevini verdim.

İşte bundan böyle çıktı.

Bu komut dosyası hem MQL5 hem de MQL4'te çalışır. Yalnızca MT5'te çok daha hızlıdır.

Her kare benzersizdir ve tekrarlamaz, yani komut dosyası döngüsel değildir.

 #include <Canvas\Canvas.mqh>

void OnStart ()
  {
   ChartSetInteger ( 0 , CHART_FOREGROUND , true );
   CCanvas C;
   int Width=( ushort ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );   // получаем Ширину окна
   int Height=( ushort ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS ); // получаем Высоту окна
   if (!C.CreateBitmapLabel( 0 , 0 , "CanvasExamlple" , 0 , 0 ,Width,Height, COLOR_FORMAT_XRGB_NOALPHA )) // создаем канвас размером текущего окна
   Print ( "Error creating canvas: " , GetLastError ()); 
   uint i= 0 ,j= 100000 ;
   int size=Width*Height;
   uchar h[ 25600 ];
   for ( int w= 0 ;w< 25600 ;w++) 
   h[w]= uchar ( 128 + 128 * sin ( double (w)/ 256 )); //создаем массив для ускорения работы
   double X1= 0 ,Y1= 0 ,X2= 0 ,Y2= 0 ;
   while (! IsStopped ())
     {
       int pos= int (i%size);
       if (pos== 0 )
        {
         C.Update();
         //Sleep(30);
         X1= Width-( sin (( double )j/ 100 )*( double )Width);
         Y1= Height-( cos (( double )j/ 140 )*( double )Height);
         X2= Width+( cos (( double )j/ 80 )*( double )Width);
         Y2= Height+( sin (( double )j/ 20 )*( double )Height);
         j++;
        }
       int X=pos%Width;
       int Y= int (pos/Width);
       double d= ((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))/(((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))+((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y)));
      C.m_pixels[pos]=XRGB(h[ int (d* 11520 )],h[ int (d* 17920 )],h[ int (d* 6400 )]);
      i++;
     }
   C.Destroy();
  }


Derlemeden önce m_pixels[] dizisini protected:'den Canvas.mqh dosyasındaki public'e aktarmak gerekir:

 public :
   uint               m_pixels[];               // array of pixels

                     CCanvas( void );
                    ~CCanvas( void );
Dosyalar:
Swirl.mq5  3 kb
Swirl.ex5  16 kb
 

Harika, kesinlikle!

Ve faydalı şeyler için bile kullanılabilir ;)

 
Andrey Khatimlianskii :

Harika, kesinlikle!

Ve faydalı şeyler için bile kullanılabilir ;)

İnsanların tuvali faydalı şeylerde kullanmaya başlaması için işe yaramaz şeyler göstererek başlamanız gerekir. :))

 
Nikolai Semko :

Derlemeden önce m_pixels[] dizisini protected:'den Canvas.mqh dosyasındaki public'e aktarmak gerekir:

SB'de hiçbir şeyi değiştiremezsiniz.

 class CCanvas2 : public CCanvas
{
private :
   int Pos;

public :
  CCanvas2* operator []( const int iPos )
  {
     this .Pos = iPos;
    
     return (& this );
  }
  
   void operator =( const uint Color )
  {
     this .m_pixels[ this .Pos] = Color;
  }
};


 CCanvas2 C;
//..
// C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);
C[pos] =XRGB(h[ int (d* 11520 )],h[ int (d* 17920 )],h[ int (d* 6400 )]);
 
fxsaber :

SB'de hiçbir şeyi değiştiremezsiniz.


Güzel! :))

Ama ne yazık ki ücretsiz değil.

Kontrol. MT5'teki genel yavaşlama ~%11 idi

 
Nikolai Semko :

Güzel! :))

Ama ne yazık ki ücretsiz değil.

Kontrol. MT5'teki genel yavaşlama ~%11 idi

Sizin durumunuzda, CCanvas'tan %1 kullanılır. CCanvas olmadan deneyin. Kod biraz daha karmaşık olmayacak ve hız daha da artacak.

 
fxsaber :

Sizin durumunuzda, CCanvas'tan %1 kullanılır. CCanvas olmadan deneyin. Kod biraz daha karmaşık olmayacak ve hız daha da artacak.

Elbette, CCanvas sınıfı olmadan da yapabilirsiniz. Ancak kod artacak ve hız kazancı olmayacak çünkü aslında, CCanvas sınıfından, m_pixels[] grafik kaynağının sadece nokta dizisini kullanıyorum (pekala, ayrıca Update() ve Destroy() işlevleri, ancak bunlar ihmal edilebilir, çünkü onlardan tasarruf etmeyeceksiniz ).

Ve dizi de Afrika'da bir dizi. Üzerindeki hızı nasıl artırabilirsiniz? Mümkün değil. Sadece CCanvas sınıfı, bir kaynak oluştururken, onu güncellerken (daha doğrusu yeniden oluştururken) ve onu silerken bazı rutinlerle ilgilenir.

Yoksa C.m_pixels[]'in doğrudan dizi erişimi olarak derlenmediğini mi söylüyorsunuz? Bence düz ileri. Orada herhangi bir ara hareket olmadan. Ya da ben hatalıyım?

Ve bu sınıfın geliştiricileri için CreateBitmapLabel'i sınıfın kendisinin oluşturucusuna sokmak daha da mantıklı olacaktır, böylece ortaya çıkmaz. Sınıfın parametresiz yeni bir örneği oluşturulursa, bir pencere boyutunda (benim durumumda olduğu gibi) bir tuval oluşturulur ve istenirse sınıfın bir örneğini oluştururken parametreleri belirtebilirsiniz. Şahsen ben sadece bunu yaptım.

 
Nikolai Semko :

Elbette, CCanvas sınıfı olmadan da yapabilirsiniz. Ancak kod artacak ve hız kazancı olmayacak çünkü aslında, CCanvas sınıfından, m_pixels[] grafik kaynağının sadece nokta dizisini kullanıyorum (pekala, ayrıca Update() ve Destroy() fonksiyonları da, ama bunlar ihmal edilebilir, çünkü onlardan tasarruf etmeyeceksiniz. ).

Ve dizi de Afrika'da bir dizi. Üzerindeki hızı nasıl artırabilirsiniz? Mümkün değil. Sadece CCanvas sınıfı, bir kaynak oluştururken, onu güncellerken (daha doğrusu yeniden oluştururken) ve onu silerken bazı rutinlerle ilgilenir.

Yoksa C.m_pixels[]'in doğrudan dizi erişimi olarak derlenmediğini mi söylüyorsunuz? Bence düz ileri. Orada herhangi bir ara hareket olmadan. Ya da ben hatalıyım?

CCanvas - ResourceCreate sarmalayıcı. Bu nedenle, örneğin, zaten diziler şeklinde 20 hazır resminiz var. Bunları tuval aracılığıyla değiştirmek istiyorsanız, sürekli olarak pahalı ArrayCopy + Update yapmanız gerekecektir.

Ve eğer CCanvas olmadan yaparsanız, her şey yalnızca ResourceCreate+ChartRerdraw ile sonuçlanacaktır. Kod tabanına dinamik çizimli birkaç çalışma yükledim. Orada CCanvas'ın iyi olmadığı açıktı.

 
Nikolai Semko :

Derlemeden önce m_pixels[] dizisini protected:'den Canvas.mqh dosyasındaki public'e aktarmak gerekir:

Ve PixelSet kesinlikle yardımcı olmayacak mı?

 
Rashid Umarov :

Ve PixelSet kesinlikle yardımcı olmayacak mı?

Elbette yardımcı olacaktır, ancak korkunç frenler olacaktır. Her şeyden önce, bir işlevi çağırmak artık ücretsiz değil. parametreler aktarılır ve kaydedilir (PixelSet'te bu referans olarak bile olmaz), tüm kayıtların yığına itilmesi ve ardından geri çekilmesi gerekir. İkinci olarak, fonksiyonun kendisinde, X ve Y'nin belirtilen aralıkta olup olmadığı kontrol edilir ve üçüncü olarak dizi indeksi hesaplanır. Ve tüm bunlara ihtiyacım yok çünkü. dizin zaten orada ve benim algoritmamda aralık dışında olmak imkansız.

 
Harika gökkuşağı tablosu! Bir diğeri de mumları müzikle dans ettirip kendi aralarında döndürmek olabilir!
Neden: