Errori, bug, domande - pagina 2063

 
Ci sono due oggetti bmp con canali di trasparenza. Quando si sovrappongono, appaiono alcuni colori uint. Come posso calcolare da solo questi valori se conosco i colori uint dei pixel sovrapposti di ogni oggetto?
 
fxsaber:
Ci sono due oggetti bmp con canali di trasparenza. Quando si sovrappongono, vengono generati alcuni colori uint. Come posso calcolare da solo questi valori se conosco i colori uint dei pixel sovrapposti di ogni oggetto?

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:

Grazie! Un'altra domanda. Se, per esempio, cinque oggetti si sovrappongono nello stesso momento, le coppie (alto/basso) devono essere fatte dal basso verso l'alto o dall'alto verso il basso?

 
fxsaber:

Grazie!


Meglio disegnare tutti gli oggetti (bmp) sulla stessa tela in una volta sola, è un approccio più semplice a lungo termine.

 
Andrey Barinov:

È meglio disegnare tutti gli oggetti (bmp) su una tela in una volta sola, è un approccio più semplice a lungo termine.

Ecco perché lo chiedo. Sopra c'è un'altra domanda.

 
fxsaber:

Grazie! Un'altra domanda. Se, per esempio, cinque oggetti si sovrappongono, le coppie (in alto/basso) devono essere disegnate dal basso verso l'alto o dall'alto verso il basso?


Devo disegnare a strati, in ordine (zorder), dal basso verso l'alto, perché devo assumere che non so quali pixel dei cinque oggetti si intersecheranno. Come su una vera tela.

Dopo il mix, appare così


 
Andrey Barinov:

Disegno a strati, secondo l'ordine (come zorder), dal basso verso l'alto, perché non è immediatamente chiaro quali pixel dei cinque oggetti si sovrapporranno. Come su una vera tela.

Dopo averla mescolata, si ottiene qualcosa del genere.

È fantastico! Stai usando CCanvas o è una soluzione tutta tua? Quale approccio è migliore a lungo termine?

 
fxsaber:

Grande! Stai usando un CCanvas raffinato o una soluzione completamente tua? Quale approccio è migliore a lungo termine?


Ho dovuto scrivere il mio, ma con significativi frammenti di codice presi in prestito dalla libreria standard (algoritmi di disegno primitivo, anti-aliasing, ecc.). Imprigionare pezzi di codice nel mio concetto di lavoro con la grafica si è rivelato più facile che avvolgere il mio concetto intorno alla libreria standard.

Non mi dispiacerebbe usare la libreria standard se fosse "live", ma finora non è adattata alla GUI in alcun modo.

 
Andrey Barinov:

Ho dovuto scrivere il mio, ma con un prestito significativo di pezzi di codice dalla libreria standard (algoritmi di disegno primitivo, anti-aliasing, ecc.). Imprigionare pezzi di codice nel mio concetto di lavoro con la grafica si è rivelato più facile che avvolgere il mio concetto intorno alla libreria standard.

Non mi dispiacerebbe usare la libreria standard, se fosse "live", ma finora non è adattata alla GUI in alcun modo.

Ora capisco, grazie.

 
Bug della lingua
#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
}