La toile est cool ! - page 47

 
Maxim Kuznetsov:

pas un cercle sur un plan, mais un cylindre en 3d :-) Le cours sortira en spirale. Si vous réussissez à marquer les coordonnées cylindriques, c'est une chose assez sensée...

C'est possible.
 
Maxim Kuznetsov:

Alors ce n'est pas un cercle sur le plan, mais un cylindre en 3d :-) Le cours sortira en spirale. Si vous réussissez à marquer les coordonnées cylindriques, c'est une chose assez sensée...

En fait, ce n'est pas du tout difficile à mettre en œuvre. 2-5 lignes de code en plus. Si personne ne l'a fait avant moi, quand j'aurai une minute de libre, je le ferai.

Mais c'est mieux d'avoir un écran 4K

 
Maxim Kuznetsov:

alors pas un cercle sur un plan, mais un cylindre en 3d :-) Le cours sortira en spirale. Si vous réussissez à marquer les coordonnées cylindriques, c'est une chose assez sensée...

https://www.mql5.com/en/code/27662

Notez la vitesse et la taille du code.
Et tout cela sans Direct X

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

Notez la vitesse et la taille du code.
Et tout cela sans Direct X

Magique !

De quoi dépend le rayon ?

Est-il difficile de rendre l'anneau multicolore ?

Cette visualisation serait peut-être utile pour évaluer les 50 meilleures passes dans l'optimisation, ou l'optimisation complète dans le compactage.

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

Notez la vitesse et la taille du code.
Et tout cela sans Direct X

Tout simplement, la magie. ! !!

Et si vous ajoutez une grille polaire à l'axe, et la possibilité de modifier l'échelle, jusqu'à des "parallèles" presque droits (et des "méridiens" parallèles), vous obtenez une transition en douceur vers les graphiques traditionnels.

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

Notez la vitesse et la taille du code.
Et tout cela sans Direct X

+++
 

Merci à tous !


Aleksey Vyazmikin:

C'est magique !

De quoi dépend le rayon ?

Est-il difficile de rendre l'anneau multicolore ?

Cette visualisation serait peut-être utile pour évaluer les 50 meilleures passes pendant l'optimisation, ou l'optimisation complète pendant le compactage.

Le code pour ce graphisme 3D et le contrôle de la rotation tient tout entier dans cette fonction :

void Draw(double &c[]) {
   double _r=_Height/2-7;
   int Per=int(2*M_PI*_r);
   int X=_Width/2;
   int Y=_Height/2-5;
   double K=10*_Height;
   Canvas.Erase(0xFF000000);
   int Size =ArraySize(c);
   double max = c[ArrayMaximum(c,0)];
   double min = c[ArrayMinimum(c,0)];
   if (max-min<=0) return;
   double _a=2*M_PI/per*(_Width/2  - _MouseX + 5*per); // угол камеры по горизонтали (_MouseX  - текущая координата X указателя мышки)
   double _b=2*M_PI/per*(_Height/2 - _MouseY + 5*per); // угол камеры по вертикали   (_MouseY  - текущая координата Y указателя мышки)
   for (int i=0; i<Size; i++) {
      double r = _r*(0.3+0.7*(c[i]-min)/(max-min));
      double a = 2*M_PI/per*i;
      double z =r -r*2*double(i)/Size;
      double x = cos(a)*r;
      double y = sin(a)*r;
      double R=sqrt(x*x+y*y+z*z);
      double x1=x*cos(_a)+z*sin(_a);
      double z1=-x*sin(_a)+z*cos(_a);
      double y1=y*cos(_b)+z1*sin(_b);
      double z2=-y*sin(_b)+z1*cos(_b);
      z2=z2+_r;
      x=X+K*x1/(z2+K);
      y=Y+K*y1/(z2+K);
      _PixelSet((int)x,(int)y,Grad(double(i)/Size));
   }
   Canvas.Update();
}

L'entrée de cette fonction est uniquement un tableau de prix. Même un écolier peut comprendre le code. Un tableau de prix unidimensionnel est converti en un tableau de points tridimensionnel. Dans le plan XY, le prix est représenté dans le système de coordonnées polaires, où la distance r=sqrt( x2+y2) au centre (0,0) est la valeur du prix.

La sélection des couleurs est de la responsabilité de cette fonction :

uint Grad(double p) {
   static uint Col[6]= {0xFF0000FF,0xFFFF00FF,0xFFFF0000,0xFFFFFF00,0xFF00FF00,0xFF00FFFF};
   if(p>0.9999) return Col[5];
   if(p<0.0001) return Col[0];
   p=p*5;
   int n=(int)p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c1.c[2]+uchar(k*(c2.c[2]-c1.c[2])+0.5),
               c1.c[1]+uchar(k*(c2.c[1]-c1.c[1])+0.5),
               c1.c[0]+uchar(k*(c2.c[0]-c1.c[0])+0.5));
}

dont l'entrée p est un nombre compris entre 0 et 1, et dont la sortie est la couleur du gradient sélectionné. Le squelette du motif de couleur lui-même, dans ce cas, se compose de 6 couleurs (tableau Col)

Vous êtes libre de colorier comme vous le voulez et de la manière que vous voulez.

 
Aleksey Panfilov:

Tout simplement, la magie. ! !!

Et si vous ajoutez une grille polaire à l'axe, et la possibilité de modifier l'échelle, jusqu'à des "parallèles" presque droits (et des "méridiens" parallèles), vous obtenez une transition en douceur vers le graphique traditionnel.

Bien sûr, mais je ne veux pas encombrer le code avec des échelles différentes. Dans ce cas, il était important pour moi de montrer le code qui ne contient rien de superflu. Pour qu'il soit plus facile de le comprendre.

 
Nikolai Semko:

Bien sûr, mais je ne veux pas encombrer le code avec des échelles différentes. Dans ce cas, il était important pour moi de montrer le code sans rien de superflu. Il serait plus facile de le comprendre.

Nikolay, une question sur votre bibliothèque, comment prendre des données dans l'Expert Advisor ?

 
Martingeil:

Nikolay, une question sur votre bibliothèque, comment prendre les données dans l'Expert Advisor ?

Je ne comprends pas la question. iCanvas est une bibliothèque graphique.
Vous vous demandez probablement comment lire les données dans l'EA si vous créez un indicateur avec une visualisation de ligne via iCanvas et que vous le laissez sans tampon ? Alors, veuillez vous exprimer plus clairement.

Tout d'abord, personne ne vous interdit de créer des tableaux d'indicateurs tampons, comme dans un indicateur standard, mais faites-en simplement des INDICATOR_CALCULATIONS et accédez ensuite aux données via iCustom de la manière habituelle.

Deuxièmement, il existe un outil aussi puissant que les ressources. Les tampons indicateurs sont essentiellement les mêmes ressources. Quoi qu'il en soit, ils utilisent le même mécanisme de stockage et d'accès aux données.

S'occuper des ressources. Ce n'est pas très simple, mais c'est un outil important pour le transfert de données. Vous pouvez créer vos propres bibliothèques qui sont plus efficaces que les tableaux tampons classiques.

Personnellement, j'utilise mes propres développements, que je ne publie pas. Ils sont plus pratiques et plus efficaces que l'accès iCustom. Tout est mis en œuvre exactement par le biais des ressources.

Raison: