Discusión sobre el artículo "¡Visualice esto! La biblioteca gráfica en MQL5 como un análogo de plot en el lenguaje R" - página 5

 
Artyom Trishkin #:

Todos los métodos de suavizado dependen en gran medida de la opacidad de las líneas. Alrededor del 50% de opacidad todo se vuelve sin suavizar y tiene artefactos.

Ahora hay artefactos incluso con líneas totalmente opacas.

Estábamos hablando de intentar dibujar un círculo totalmente opaco con bordes suavizados (utilizando el algoritmo de Wu) sin perder suavidad.

Esto requiere métodos especiales de relleno con bordes suavizados.

 
Anatoli Kazharski #:

Ahora hay artefactos incluso con líneas completamente opacas.

Se trataba de intentar dibujar un círculo completamente opaco con bordes suavizados (utilizando el algoritmo de Wu) sin pérdida de suavidad.

Esto requiere métodos especiales de relleno con bordes suavizados.

¿Entiendo que no puedes hacerlo tú mismo?

 
Artyom Trishkin #:

¿Me doy cuenta de que no puedo hacerlo solo?

¿Por qué no? Inténtalo. )

Incluso puedes resolver el caso que mencionas:

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Discusión del artículo "¡Visualízalo! Librería gráfica en MQL5 como análogo de plot de R"

Artyom Trishkin, 2023.07.31 12:39 AM

Todos los métodos de suavizado dependen fuertemente de la opacidad de la línea. Alrededor del 50% de opacidad todo se vuelve no suave y tiene artefactos.

Es decir, la representación en un lienzo totalmente transparente (CCanvas) se puede hacer teniendo en cuenta la capa inferior (gráfico y otros objetos) y será sin artefactos.

Pero parece bastante engorroso. Tampoco está claro cuánto afectará al rendimiento. Me gustaría que los desarrolladores del terminal arreglaran este error.

 
Anatoli Kazharski #:

¿Por qué no? ¡Pruébalo! )

Incluso puedes resolver el caso que mencionas:

Es decir, la renderización en un lienzo totalmente transparente (CCanvas) se puede hacer teniendo en cuenta la capa inferior (gráfico y otros objetos) y estará libre de artefactos.

Pero parece bastante engorroso. Tampoco está claro cuánto afectará al rendimiento. Me gustaría que los desarrolladores del terminal arreglaran este error.

Yo enviaría tal tarea (si no los desarrolladores, pero los miembros del foro) a Nikolai @Nikolai Semko para la solución ;)

 
Artyom Trishkin #:

Yo enviaría tal tarea (si no a los desarrolladores, sino a los miembros del foro) a Nikolai @Nikolai Semko para que la resolviera ;)

Él trabaja con un solo lienzo.

Y yo no estoy dispuesto a reescribir mi biblioteca de gráficos para hacer que todo funcione en un solo lienzo.

Aunque es interesante, pero sabiendo el tiempo que puede llevar, de momento no me decido a acometer semejante reto. Ahora no tengo tanto tiempo como antes.

 
Anatoli Kazharski #:

Sólo funciona con un lienzo.

Y no estoy dispuesto a reescribir mi biblioteca de gráficos para que todo funcione en un solo lienzo.

Aunque es interesante, pero sabiendo el tiempo que me podría llevar no puedo decidirme a emprender semejante reto por el momento. Ahora no tengo tanto tiempo como antes.

Bueno, es un algoritmo. ¿Qué más da en un lienzo o en varios?

 
Artyom Trishkin #:

Bueno, es un algoritmo. ¿Qué más da que sea en un lienzo o en varios?

Hemos discutido dos problemas:

1. Si es el que yo planteaba en un principio, entonces una solución algorítmica sería suficiente para algunos casos.

2. Si es el que mencionaste, entonces un par de funciones no servirán aquí. Necesitas un esquema en el que todas las capas se almacenen en arrays. Cada capa debe dibujarse teniendo en cuenta lo que se dibuja en las capas por debajo de ella. Además, todos los métodos de la clase CCanvas deben ser corregidos. El color de cada píxel debe mezclarse con el de debajo, teniendo en cuenta la transparencia. Así no habrá artefactos (huecos, bordes dentados, etc.). Si lo haces bien, puedes implementar la translucidez con desenfoque. Todo esto es bastante fácil de implementar en un solo lienzo. Pero cuando se utilizan varios lienzos, es mucho más difícil de implementar.

 
Anatoli Kazharski #:

Sólo funciona con un lienzo.

Y no estoy dispuesto a reescribir mi biblioteca de gráficos para que todo funcione en un solo lienzo.

Aunque es interesante, pero sabiendo el tiempo que podría llevar no puedo decidirme a emprender semejante reto por el momento. Ahora no tengo tanto tiempo como antes.

En realidad utilizo varios lienzos ( normalmente no más de 4)
Siempre hay un término medio. Un extremo es pintar toda la estática y toda la dinámica en un lienzo, el otro extremo es pintar todos los objetos en lienzos separados.
Es importante no olvidar que si usted tiene dos lienzos con la transparencia, la superposición de unos a otros, entonces todavía la CPU, (tal vez en Win10-11 GPU, pero creo que todavía CPU), se mezcla cada píxel, incluso homogénea (transparencia no cero) de fondo.
Aquí podemos tomar prestado de JS la práctica de almacenar en caché el lienzo o una parte de ella para mejorar el rendimiento.
En cuanto a los círculos antialiased, ya he publicado una variante de tal círculo, que es ideal (en términos de rendimiento) para los círculos con radio inferior a ~ 5 píxeles. Creo que la función se llamaba iDot(), y estaba en el código de 3DStars. Es muy primitiva y corta (unas 10 líneas de código). Para círculos de radio más grande, está lejos de ser óptima en términos de rendimiento. Para radios mayores, la función de alto rendimiento ya supera las 100 líneas de código.
Sí, después de años de establecer nuevas conexiones neuronales en el cerebro sobre lienzo, ahora puedo hacer una biblioteca sobre lienzo a cualquier nivel. Habría tiempo y motivación.
El algoritmo Wu se considera obsoleto.
 
Anatoli Kazharski #:

Hablamos de dos retos:

1. Si es al que me refería en un principio, para algunos casos bastaría con una solución algorítmica.

2. Si es el que mencionabas, entonces un par de funciones no serán suficientes. Necesitas un esquema en el que todas las capas se almacenen en arrays. Cada capa debe ser dibujada teniendo en cuenta lo que se dibuja en las capas por debajo de ella. Además, todos los métodos de la clase CCanvas deben ser corregidos. El color de cada píxel debe mezclarse con el de debajo, teniendo en cuenta la transparencia. Así no habrá artefactos (huecos, bordes dentados, etc.). Si lo haces bien, puedes implementar la translucidez con desenfoque. Todo esto es bastante fácil de implementar en un solo lienzo. Pero cuando se utilizan varios lienzos, es mucho más difícil de implementar.

Pensaba que sólo me refería al algoritmo de suavizado. Sin tener en cuenta la superposición de lienzos transparentes entre sí. Aunque... Si los superpones, seguramente aparecerán nuevos problemas. Por eso me refería a Nikolay - ya ves, él tiene todas las conexiones neuronales desde hace mucho tiempo, y su cerebro probablemente ya está pensando por sí mismo teniendo en cuenta todos los posibles problemas con el lienzo).

 
Artyom Trishkin #:

Pensaba que sólo hablaba del algoritmo de alisado. Sin hacer referencia a la superposición de lienzos transparentes unos sobre otros. Aunque... Si los superpones, seguramente aparecerán nuevos problemas. Por eso me refería a Nikolay - ya ves, él tiene todas las conexiones neuronales desde hace mucho tiempo, y su cerebro probablemente ya está pensando por sí mismo teniendo en cuenta todos los posibles problemas con el lienzo).

Artem, en realidad no son tareas triviales que requieren nuevas conexiones neuronales. Por ejemplo, en SVG hay un concepto como viewBox. Ya he visto un montón de vídeos sobre cómo funciona, he leído un montón de documentación, he escrito un montón de código, y aún así a veces me quedo perplejo. Todavía no tengo las conexiones neuronales necesarias, aunque varias veces parecía que lo había descifrado todo.