Discusión sobre el artículo "Indicadores personalizados e infografía en CCanvas"

 

Artículo publicado Indicadores personalizados e infografía en CCanvas:

En este artículo se analizarán nuevos tipos de indicadores con una estructura de implementación más compleja. Se describirá la construcción de los indicadores de los tipos pseudo-3D y la creación de infografías que cambian de manera dinámica.

Ya hemos analizado las clases y los principios de construcción de figuras complejas con la ayuda de primitivas. En la clase de la construcción de indicadores de tipo histograma se ha tocado parcialmente el tema de la construcción de un espacio bidimensional de objetos que parecen estar en 3D (fig.13) gracias a la elección del color. Sin embargo, la pirámide no es una figura plana, por eso, al construirla en el sistema bidimensional indicado, usaremos su proyección isométrica. La estructura básica no se distingue por su gran número de elementos (fig.14), sin embargo, el método de construcción de la proyección de la pirámide y su visualización son la parte principal de la implementación de esta clase.


Fig.14. Estructura básica de la clase CPyramid.

Autor: Alexander Fedosov

 

Es genial, pero no hay antialiasing en absoluto. Dibujar con cuadrados de píxeles está atrasado.

He aquí un ejemplo que demuestra que el antialiasing existe en la naturaleza:


 
Nikolai Semko:

Es genial, pero no hay antialiasing en absoluto. Dibujar con cuadrados de píxeles está atrasado.

Aquí hay un ejemplo que demuestra que el antialiasing existe en la naturaleza:


¿Y el código?

 
Rashid Umarov:

¿Y el 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;   // retardo en milisegundos entre la salida a la pantalla
input bool top = false; // ¿dibujar bajo el gráfico?
input ENUM_COLOR_FORMAT format=COLOR_FORMAT_ARGB_NORMALIZE; //Método de tratamiento del color
input int Ncirl =30;    // número de círculos
input int MaxSizeCircle = 200; // tamaño máximo de los círculos
//+------------------------------------------------------------------+
//| Función de inicio del 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);  // obtener la anchura de la ventana
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // obtener la altura de la ventana
   uint ColorScreen=(color)ChartGetInteger(0,CHART_COLOR_BACKGROUND,0);// obtener el color de fondo de la ventana

   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);
  }
Archivos adjuntos:
 
Rashid Umarov:

¿Y el código?


El cCanvas estándar ya tiene varios métodos de suavizado para todas las formas, ¿verdad?

 
Andrey Barinov:

El cCanvas estándar ya tiene varios métodos de suavizado para todas las formas.

Por desgracia. Incluso la última función de círculo basada en el método de Wu contiene errores y da un error notable en el suavizado en lugares diagonales del círculo debido a la primitividad de este método, y es muy subóptima en términos de velocidad. Además, las formas rellenas suavizadas simplemente no existen.
 
Nikolai Semko:
Por desgracia. Incluso la última función de círculo basada en el método de Wu contiene errores y da un error notable en el suavizado en lugares diagonales del círculo debido a la primitividad de este método, y es muy subóptima en términos de velocidad. Las formas rellenas especialmente suavizadas simplemente no existen.
Bueno, entonces sólo puedo unir a la pregunta.

¿Y el código?
 
Rashid Umarov:

¿Y el código?

Andrey Barinov:
Bueno, entonces sólo puedo unirme a la pregunta.

¿Y el código?

Es extraño por qué me haces esta pregunta. Yo no trabajo en Metaquotes, aunque sueño con trabajar allí. Si yo trabajaba en esta empresa, entonces yo sería capaz de trabajar bien en esta cuestión, así como no sólo en la cuestión de suavizado en CCanvas biblioteca, sino también, por ejemplo, en toda regla las funciones 3D en lienzo.
Pero ahora sólo tengo experimentos hechos de rodillas, que tengo miedo de publicar, porque sé que puedo hacerlo mejor, pero se necesita tiempo.

Realmente no entiendo por qué todas las realizaciones con la ayuda de kanvas (en este artículo o, por ejemplo, aquí) se implementan sin suavizado. Después de todo, usted tiene que estar de acuerdo, es llamativo a la vista este inconveniente debido a la sierra de píxeles y cuánto más fresco que se vería con el uso de antialiasing. Bueno vaya a cualquier sitio web, mire en su iPhone o Android, hay botones sólidos redondos o redondeados. ¿Encontrarás allí círculos sin antialiasing? Pero, ¿por qué todavía no hay una implementación completa de suavizado en MQL5?, el lenguaje que pretende ocupar un lugar bajo el sol. ¿Estoy equivocado? Por eso empecé este tema y publiqué este ejemplo para demostrar que no hay nada sobrenatural en ello:
Archivos adjuntos:
 
Nikolai Semko:

Es extraño que me haga esta pregunta. Yo no trabajo para Metaquotes, aunque sueño con trabajar allí. Si yo trabajaba en esta empresa, entonces yo sería capaz de trabajar bien en este tema, así como no sólo en el tema de anti-aliasing en la biblioteca CCanvas, sino también, por ejemplo, en funciones 3D completo en lienzo.
Pero ahora sólo experimentos, montado sobre mis rodillas, que tengo miedo de publicar, porque sé que puedo hacerlo mejor, pero se necesita tiempo.

Haz el trabajo, escribe un artículo. Y te pagarán y será útil.
 

Por décima vez, el tema está marcado como no leído, aunque no hay ediciones ni mensajes nuevos.

¿Alguien está jugando o es que el foro no funciona?

 
Andrey Khatimlianskii:

Por décima vez, el tema está marcado como no leído, aunque no hay ediciones ni mensajes nuevos.

¿Alguien está trasteando o es que el foro no funciona?


Tengo la sospecha de que el autor (¿autor?) está editando su post.

Otra opción: alguien empezó a escribir un post y lo dejó, ahora este post se cuelga en modo edición, y el foro cada minuto (¿5, 10 minutos?) nota que algo está pasando en el tema.