Discussão do artigo "Indicadores personalizados e infográficos no CCanvas"

 

Novo artigo Indicadores personalizados e infográficos no CCanvas foi publicado:

O artigo considera novos tipos de indicadores com uma implementação estrutural mais complexa. Ele também descreve o desenvolvimento de indicadores do tipo pseudo-3D e infográficos dinâmicos.

Nós examinamos as classes e os princípios de construção de formas complexas usando primitivas. Ao descrever a classe para a construção de indicadores do tipo histograma, eu mencionei a possibilidade de desenho de objetos pseudo-3D (Fig. 13) por meio da seleção de cores. No entanto, a pirâmide não é uma figura plana. Portanto, nós temos que usar sua projeção isométrica em um determinado sistema de coordenadas bidimensional. A estrutura básica não contém muitos elementos (Fig.14), mas o método da projeção e visualização da pirâmide é a parte principal da implementação da classe.


Fig. 14. Estrutura básica da classe CPyramid

Autor: Alexander Fedosov

 

É legal, mas não há anti-aliasing algum. Desenhar com quadrados de pixel está ultrapassado.

Aqui está um exemplo que demonstra que o antialiasing existe na natureza:


 
Nikolai Semko:

É legal, mas não há anti-aliasing algum. Desenhar com quadrados de pixels está ultrapassado.

Aqui está um exemplo que demonstra que o antialiasing existe na natureza:


E o código?

 
Rashid Umarov:

E o código?


De nada:

#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Demonstrating Canvas features"
#property script_show_inputs 
//---
#include <Canvas\CanvasPro.mqh>
//+------------------------------------------------------------------+
//| entradas|
//+------------------------------------------------------------------+
input int pause = 20;   // atraso em milissegundos entre a saída para a tela
input bool top = false; // desenhar sob o gráfico?
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Método de processamento de cores
input int Ncirl =30;    // número de círculos
input int MaxSizeCircle = 200; // tamanho máximo dos círculos
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
int OnStart(void)
  {

   double r1[],r2[],k1[],k2[];
   int x[],y[];
   uint col[];
   int j=0;
   ArrayResize(r1,Ncirl);
   ArrayResize(r2,Ncirl);
   ArrayResize(k1,Ncirl);
   ArrayResize(k2,Ncirl);
   ArrayResize(x,Ncirl);
   ArrayResize(y,Ncirl);
   ArrayResize(col,Ncirl);
   
   ChartSetInteger(0,CHART_FOREGROUND,top);
   int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // obter a largura da janela
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // obter a altura da janela
   uint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);// obter a cor de fundo da janela

   CCanvasPro canvas;
   if(!canvas.CreateBitmapLabel("SampleCanvas",0,0,Width,Height,format))
     {
      Print("Error creating canvas: ",GetLastError());
      return(-1);
     }
   canvas.SetBack(false);
   canvas.Erase(ColorScreen);
   canvas.Update();
   srand(GetTickCount());
   for(int i=0;i<Ncirl;i++)
     {
      x[i]=rand()%Width;
      y[i]=rand()%Height;
      r1[i]=rand()%MaxSizeCircle;
      r2[i]=rand()%MaxSizeCircle;
      k1[i]=(double)(rand()%10)/1000;
      k2[i]=(double)(rand()%10)/1000;
      col[i]=XRGB(rand()%255,rand()%255,rand()%255);
     }
   while(!IsStopped())
     {
      canvas.Erase(ColorScreen);
      for(int i=0;i<Ncirl;i++) canvas.CircleSS(x[i],y[i],r1[i]*fabs(sin(j*k1[i])),r2[i]*fabs(sin(j*k2[i])),col[i]);
      Sleep(pause);
      canvas.Update();
      j++;
     }

   ObjectDelete(0,"SampleCanvas");
   canvas.Destroy();
   return(0);
  }
Arquivos anexados:
 
Rashid Umarov:

E o código?


O cCanvas padrão já tem vários métodos de suavização para todas as formas, certo?

 
Andrey Barinov:

O cCanvas padrão já tem vários métodos de suavização para todas as formas.

Infelizmente. Até mesmo a última função de círculo com base no método Wu contém bugs e apresenta um erro perceptível na suavização em locais diagonais do círculo devido à primitividade desse método, além de ser muito abaixo do ideal em termos de velocidade. Além disso, as formas preenchidas suavizadas simplesmente não existem.
 
Nikolai Semko:
Infelizmente. Até mesmo a última função de círculo baseada no método de Wu contém bugs e apresenta um erro perceptível na suavização em locais diagonais do círculo devido à primitividade desse método, além de ser muito abaixo do ideal em termos de velocidade. Formas preenchidas especialmente suavizadas simplesmente não existem.
Bem, então só posso me juntar à pergunta.

E o código?
 
Rashid Umarov:

E o código?

Andrey Barinov:
Bem, então só posso participar da pergunta.

E o código?

É estranho que esteja me fazendo essa pergunta. Eu não trabalho na Metaquotes, embora sonhe em trabalhar lá. Se eu trabalhasse nessa empresa, seria capaz de trabalhar bem nessa questão, bem como não apenas na questão da suavização na biblioteca CCanvas, mas também, por exemplo, em funções 3D completas na tela.
Mas agora tenho apenas experimentos feitos de joelhos, que tenho medo de publicar, porque sei que posso fazer melhor, mas isso leva tempo.

Realmente não entendo por que todas as realizações com a ajuda do kanvas (neste artigo ou, por exemplo, aqui) são implementadas sem suavização. Afinal, você tem que concordar, é impressionante para os olhos esse obstáculo por causa da serra de pixels e como ele ficaria muito mais legal com o uso de antialiasing. Bem, vá a qualquer site, olhe em seu iPhone ou Android, há botões sólidos redondos ou arredondados. Você encontrará círculos lá sem o antialiasing? Mas por que ainda não há uma implementação completa de suavização na MQL5?!?!?, a linguagem que afirma ter um lugar ao sol. Será que estou errado? É por isso que comecei este tópico e postei este exemplo para mostrar que não há nada de sobrenatural nisso:
Arquivos anexados:
 
Nikolai Semko:

É estranho que esteja me fazendo essa pergunta. Eu não trabalho na Metaquotes, embora sonhe em trabalhar lá. Se eu trabalhasse nessa empresa, seria capaz de trabalhar bem nessa questão, bem como não apenas na questão do anti-aliasing na biblioteca CCanvas, mas também, por exemplo, em funções 3D completas na tela.
Mas agora apenas experimentos, montados de joelhos, que tenho medo de publicar, porque sei que posso fazer melhor, mas isso leva tempo.

Faça o trabalho, escreva um artigo. E você será pago e ele será útil.
 

Pela décima vez, o tópico está marcado como não lido, embora não haja edições de mensagens ou novas mensagens.

Alguém está bagunçando ou o fórum está com problemas?

 
Andrey Khatimlianskii:

Pela décima vez, o tópico está marcado como não lido, embora não haja edições de mensagens ou novas mensagens.

Alguém está bagunçando ou o fórum está com problemas?


Suspeito que o autor (autor?) esteja editando sua mensagem.

Outra opção: alguém começou a escrever uma mensagem e desistiu, agora essa mensagem está suspensa no modo de edição, e o fórum a cada minuto (5, 10 minutos?) observa que algo está acontecendo no tópico.