캔버스 멋지다!

 

CCanvas 클래스를 통해 짧은 코드를 사용하여 사용자 지정 그래픽 의 기능을 효과적으로 시연하는 작업을 스스로 설정했습니다.

그것이 그것에서 나온 것입니다.

이 스크립트는 MQL5와 MQL4에서 모두 작동합니다. MT5에서만 훨씬 빠릅니다.

각 프레임은 고유하고 반복되지 않습니다. 즉, 스크립트는 순환하지 않습니다.

 #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();
  }


컴파일하기 전에 m_pixels[] 배열을 protected:에서 Canvas.mqh 파일의 public으로 전송해야 합니다.

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

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

멋지다, 확실히!

그리고 유용한 것들에도 사용할 수 있습니다 ;)

 
Andrey Khatimlianskii :

멋지다, 확실히!

그리고 유용한 것들에도 사용할 수 있습니다 ;)

사람들이 유용한 일에 캔버스를 사용하기 시작하려면 먼저 쓸모없는 것을 시연하는 것부터 시작해야 합니다. :))

 
Nikolai Semko :

컴파일하기 전에 m_pixels[] 배열을 protected:에서 Canvas.mqh 파일의 public으로 전송해야 합니다.

SB에서 아무 것도 변경할 수 없습니다.

 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에서 아무 것도 변경할 수 없습니다.


시원한! :))

그러나 불행히도 그것은 무료가 아닙니다.

확인했습니다. MT5의 전반적인 감속은 ~11%였습니다.

 
Nikolai Semko :

시원한! :))

그러나 불행히도 그것은 무료가 아닙니다.

확인했습니다. MT5의 전반적인 감속은 ~11%였습니다.

귀하의 경우 CCanvas에서 1%가 사용됩니다. CCanvas 없이 사용해 보세요. 코드가 조금 더 복잡하지 않고 속도가 훨씬 더 빨라집니다.

 
fxsaber :

귀하의 경우 CCanvas에서 1%가 사용됩니다. CCanvas 없이 사용해 보세요. 코드가 조금 더 복잡하지 않고 속도가 훨씬 더 빨라집니다.

물론 CCanvas 클래스 없이도 할 수 있습니다. 그러나 코드가 증가하고 속도가 향상되지 않습니다. 사실, CCanvas 클래스에서 저는 m_pixels[] 그래픽 리소스의 포인트 배열만 사용합니다(또한 Update() 및 Destroy() 함수도 사용하지만 저장하지 않기 때문에 무시할 수 있습니다. ).

그리고 어레이는 또한 아프리카의 어레이입니다. 어떻게 속도를 높일 수 있습니까? 안 돼요. CCanvas 클래스는 리소스 생성, 업데이트(더 정확하게는 재생성) 및 삭제할 때 일부 루틴을 처리합니다.

아니면 C.m_pixels[]가 직접 배열 액세스 로 컴파일되지 않는다는 말씀입니까? 옳다고 생각합니다. 거기에 어떤 중간 움직임도 없이. 아니면 내가 틀렸어?

그리고 이 클래스의 개발자가 CreateBitmapLabel을 클래스 자체의 생성자에 밀어넣는 것이 훨씬 더 논리적일 것입니다. 매개변수 없이 클래스의 새 인스턴스를 생성하면 창 크기로 캔버스가 생성되고(저의 경우처럼), 원하는 경우 클래스의 인스턴스를 생성할 때 매개변수를 지정할 수 있습니다. 개인적으로는 그냥 그랬습니다.

 
Nikolai Semko :

물론 CCanvas 클래스 없이도 할 수 있습니다. 그러나 코드가 증가하고 속도가 향상되지 않습니다. 사실, CCanvas 클래스에서 저는 m_pixels[] 그래픽 리소스의 포인트 배열만 사용합니다(또한 Update() 및 Destroy() 함수도 사용하지만 저장하지 않기 때문에 무시할 수 있습니다. ).

그리고 어레이는 또한 아프리카의 어레이입니다. 어떻게 속도를 높일 수 있습니까? 안 돼요. CCanvas 클래스는 리소스 생성, 업데이트(더 정확하게는 재생성) 및 삭제할 때 일부 루틴을 처리합니다.

아니면 C.m_pixels[]가 직접 배열 액세스 로 컴파일되지 않는다는 말씀입니까? 옳다고 생각합니다. 거기에 어떤 중간 움직임도 없이. 아니면 내가 틀렸어?

CCanvas - ResourceCreate 래퍼. 따라서 예를 들어 이미 배열 형태로 20개의 기성품 사진이 있습니다. 캔버스를 통해 변경하려면 값비싼 ArrayCopy + Update를 지속적으로 수행해야 합니다.

그리고 CCanvas 없이 이 작업을 수행하면 모든 것이 ResourceCreate+ChartRerdraw로만 생성됩니다. 코드베이스에 다이나믹 드로잉으로 여러 작품을 업로드했습니다. CCanvas가 좋지 않다는 것이 분명했습니다.

 
Nikolai Semko :

컴파일하기 전에 m_pixels[] 배열을 protected:에서 Canvas.mqh 파일의 public으로 전송해야 합니다.

그리고 PixelSet 이 확실히 도움이 되지 않을까요?

 
Rashid Umarov :

그리고 PixelSet 이 확실히 도움이 되지 않을까요?

물론 도움이 될 것이지만 끔찍한 브레이크가 있을 것입니다. 첫째, 함수 호출은 더 이상 무료가 아닙니다. 매개변수가 전송되고 저장되며(PixelSet에서는 참조에 의해서도 발생하지 않음) 모든 레지스터를 스택에 푸시한 다음 다시 가져와야 합니다. 두 번째로 함수 자체에서 X와 Y가 지정된 범위에 속하는지 확인하고 세 번째로 배열 인덱스를 계산합니다. 그리고 저는 이 모든 것이 필요하지 않습니다. 왜냐하면. 인덱스가 이미 있고 내 알고리즘에서 범위를 벗어날 수 없습니다.

 
멋진 무지개 차트! 다른 하나는 음악에 맞춰 양초를 춤추게 하고 서로 회전하게 하는 것입니다!
사유: