Errores, fallos, preguntas - página 2063

 
Hay dos objetos bmp con canales de transparencia. Cuando se superponen entre sí, se generan algunos colores uint. ¿Cómo puedo calcular yo mismo estos valores si conozco los colores uint de los píxeles superpuestos de cada objeto?
 
fxsaber:
Hay dos objetos bmp con canales de transparencia. Cuando se superponen entre sí, se generan algunos colores uint. ¿Cómo puedo calcular yo mismo estos valores si conozco los colores uint de los píxeles superpuestos de cada objeto?

static uchar      GetA(const uint fromcolor){return(uchar((fromcolor)>>24));}
   static uchar      GetR(const uint fromcolor){return(uchar((fromcolor)>>16));}
   static uchar      GetG(const uint fromcolor){return(uchar((fromcolor)>>8));}
   static uchar      GetB(const uint fromcolor){return(uchar(fromcolor));}
static uint       ARGBToColor(const uchar a,const uchar r,const uchar g,const uchar b){return((a<<24)|(r<<16)|(g<<8)|(b));}

static uint cColor::Mix(const uint bottom,const uint top)
  {
//===============
// if top color is not transparent => no mixing required
//===============
   if(cColor::GetA(top)==UCHAR_MAX)return(top);
//===============

//===============
   static uint bottomprev=0;
   static uint topprev=0;
   static uint resultprev=0;
//===============

//===============
   if(bottomprev==bottom && topprev==top)return(resultprev);
//===============

//===============
   bottomprev=bottom;
   topprev=top;
//===============

//===============
// Get Params of Colors
//===============
   double topA=(double)cColor::GetA(top);   double bottomA=(double)cColor::GetA(bottom);
   double topR=(double)cColor::GetR(top);   double bottomR=(double)cColor::GetR(bottom);
   double topG=(double)cColor::GetG(top);   double bottomG=(double)cColor::GetG(bottom);
   double topB=(double)cColor::GetB(top);   double bottomB=(double)cColor::GetB(bottom);
//===============

//===============
// Blend components
//===============
   uchar newA=uchar(topA+(bottomA*(255.0-topA)/255.0));
   uchar newR=uchar((topR*topA/255.0)+(bottomR*bottomA *(255.0-topA)/(255.0*255.0)));
   uchar newG=uchar((topG*topA/255.0)+(bottomG*bottomA *(255.0-topA)/(255.0*255.0)));
   uchar newB=uchar((topB*topA/255.0)+(bottomB*bottomA *(255.0-topA)/(255.0*255.0)));
//===============

//===============
   resultprev=cColor::ARGBToColor(newA,newR,newG,newB);
//===============

//===============
// New Color
//===============
   return(resultprev);
//===============
  }
 
Andrey Barinov:

Gracias. Otra pregunta. Si, por ejemplo, cinco objetos se superponen al mismo tiempo, ¿los pares (arriba/abajo) deben hacerse de abajo a arriba o de arriba a abajo?

 
fxsaber:

Gracias.


Mejor dibujar todos los objetos (bmp) en el mismo lienzo a la vez, es un enfoque más sencillo a la larga.

 
Andrey Barinov:

Es mejor dibujar todos los objetos (bmp) en un lienzo a la vez, es un enfoque más simple a largo plazo.

Por eso pregunto. Arriba hay otra pregunta.

 
fxsaber:

Gracias. Otra pregunta. Si, por ejemplo, cinco objetos se superponen entre sí, ¿los pares (arriba/abajo) deben dibujarse de abajo a arriba o de arriba a abajo?


Tengo que dibujar por capas, en orden (zorder), de abajo a arriba, porque tengo que asumir que no sé qué píxeles de los cinco objetos se cruzarán. Como en un lienzo real.

Después de la mezcla, se ve así


 
Andrey Barinov:

Dibujo en capas, según el orden (como zorder), de abajo a arriba, porque no está claro inmediatamente qué píxeles de los cinco objetos se superpondrán. Como en un lienzo real.

Después de mezclarlo, se obtiene algo así.

¡Eso es genial! ¿Utilizas CCanvas o es una solución propia? ¿Qué enfoque es mejor a largo plazo?

 
fxsaber:

¡Genial! ¿Utilizas un CCanvas refinado o una solución completamente propia? ¿Qué enfoque es mejor a largo plazo?


Tuve que escribir el mío propio, pero con importantes fragmentos de código tomados de la biblioteca estándar (algoritmos de dibujo primitivo, antialiasing, etc.). Abarcar piezas de código en mi concepto de trabajo con gráficos resultó ser más fácil que envolver mi concepto en la biblioteca estándar.

No me importaría usar la biblioteca estándar si estuviera "viva", pero hasta ahora no está adaptada a la GUI de ninguna manera.

 
Andrey Barinov:

Tuve que escribir el mío propio, pero con un importante préstamo de piezas de código de la biblioteca estándar (algoritmos de dibujo primitivo, antialiasing, etc.). Abarcar piezas de código en mi concepto de trabajo con gráficos resultó ser más fácil que envolver mi concepto en la biblioteca estándar.

No me importaría usar la librería estándar, si estuviera "viva", pero hasta ahora no está adaptada a la GUI de ninguna manera.

Ahora lo veo, gracias.

 
Error de lenguaje
#include <Expert\ExpertSignal.mqh>

void OnStart()
{
  CIndicator* a = NULL;   
  CExpertSignal b;
       
  b.InitIndicators(a); // 'InitIndicators' - no one of the overloads can be applied to the function call
}