A lona é legal! - página 47

 
Maxim Kuznetsov:

não um círculo em um plano, mas um cilindro em 3d :-) O curso sairá em uma espiral. Se você marcar com sucesso as coordenadas cilíndricas, é uma coisa muito sensata

Possivelmente.
 
Maxim Kuznetsov:

Então não um círculo no plano, mas um cilindro em 3d :-) O curso sairá em uma espiral. Se você marcar com sucesso as coordenadas cilíndricas, é uma coisa muito sensata

Na verdade, não é nada difícil de implementar. 2-5 linhas de código em adição. Se ninguém o fez antes de mim, quando eu tiver um minuto livre, eu o farei.

Mas é melhor ter uma tela de 4K

 
Maxim Kuznetsov:

então não um círculo em um plano, mas um cilindro em 3d :-) O curso sairá em uma espiral. Se você marcar com sucesso as coordenadas cilíndricas, é uma coisa muito sensata

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

Observe a velocidade e o tamanho do código.
E isso tudo sem o Direct X

 
Nikolai Semko:

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

Observe a velocidade e o tamanho do código.
E isso tudo sem o Direct X

Mágico!

De que depende o raio?

É difícil tornar o anel multicolorido?

Talvez esta visualização seja útil para avaliar os melhores 50 passes em otimização, ou toda a otimização em compactação.

 
Nikolai Semko:

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

Observe a velocidade e o tamanho do código.
E isso tudo sem o Direct X

Simplesmente, mágico. !!!

E se você adicionar uma grade polar ao eixo, e a capacidade de mudar a escala, até quase "paralelos" retos (e "meridianos" paralelos), você obtém uma transição suave para os gráficos tradicionais.

 
Nikolai Semko:

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

Observe a velocidade e o tamanho do código.
E isso tudo sem o Direct X

+++
 

Obrigado a todos vocês!


Aleksey Vyazmikin:

É mágico!

De que depende o raio?

É difícil tornar o anel multicolorido?

Talvez esta visualização seja útil para avaliar os melhores 50 passes durante a otimização, ou toda a otimização durante a compactação.

O código para este gráfico 3D e o controle de rotação se encaixam todos nesta função:

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

A entrada para esta função é apenas uma matriz de preços. Até mesmo um estudante pode entender o código. Uma matriz de preços unidimensional é convertida em uma matriz tridimensional de pontos. No plano XY o preço é representado no sistema de coordenadas polares, onde a distância r=sqrt( x2+y2) até o centro (0,0) é o valor do preço.

A seleção de cores é de responsabilidade desta função:

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

cuja entrada p é um número de 0 a 1, e cuja saída é a cor do gradiente selecionado. O esqueleto do próprio padrão de cor neste caso consiste em 6 cores (array Col)

Você é livre para colorir da maneira que quiser e da maneira que quiser

 
Aleksey Panfilov:

Simplesmente, mágico. !!!

E se você adicionar uma grade polar ao eixo, e a capacidade de mudar a escala, até quase "paralelos" retos (e "meridianos" paralelos), você obtém uma transição suave para o gráfico tradicional.

Claro, mas eu não quero desordenar o código com escalas diferentes. Neste caso foi importante para mim mostrar o código que não contém nada supérfluo. Para que fosse mais fácil entendê-lo.

 
Nikolai Semko:

Claro, mas eu não quero desordenar o código com escalas diferentes. Neste caso, foi importante para mim mostrar o código sem nada supérfluo. Seria mais fácil entendê-lo.

Nikolay, uma pergunta sobre sua biblioteca, como levar dados para o Expert Advisor?

 
Martingeil:

Nikolay, uma pergunta sobre sua biblioteca, como levar dados para o Expert Advisor?

Não entendo a pergunta. O iCanvas é uma biblioteca gráfica.
Você provavelmente está perguntando como ler dados na EA se você criar um indicador com visualização de linha via iCanvas e deixá-lo sem buffer? Então, por favor, expresse-se mais claramente.

Primeiro de tudo, ninguém proíbe que você crie matrizes de indicadores tampão, como em um indicador padrão, mas simplesmente faça INDICADOR_CALCULATIONS e depois acesse os dados através do iCustom da maneira usual.

Em segundo lugar, existe uma ferramenta tão poderosa, como os recursos. Os amortecedores indicadores são essencialmente os mesmos recursos. De qualquer forma, eles utilizam o mesmo mecanismo de armazenamento e acesso aos dados.

Lidar com os recursos. Não é muito simples, mas é uma ferramenta importante para a transferência de dados. Você pode criar suas próprias bibliotecas, que são mais eficientes do que as clássicas matrizes tampão.

Pessoalmente, utilizo meus próprios projetos, que não publico. Eles são mais convenientes e eficientes do que o acesso iCustom. Tudo é implementado exatamente através dos recursos.

Razão: