Erreurs, bugs, questions - page 2063

 
fxsaber:
Il y a deux objets bmp avec des canaux de transparence. Lorsqu'elles se chevauchent, des couleurs uint apparaissent. Comment puis-je calculer ces valeurs moi-même si je connais les couleurs uint des pixels superposés de chaque objet ?

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:

Merci ! Une autre question. Si, par exemple, cinq objets se chevauchent en même temps, faut-il faire les paires (haut/bas) de bas en haut ou de haut en bas ?

 
fxsaber:

Merci !


Il est préférable de dessiner tous les objets (bmp) sur le même canevas en une seule fois, c'est une approche plus simple à long terme.

 
Andrey Barinov:

Il est préférable de dessiner tous les objets (bmp) sur un seul canevas à la fois, c'est une approche plus simple à long terme.

C'est pour ça que je demande. Ci-dessus, une autre question.

 
fxsaber:

Merci ! Une autre question. Si, par exemple, cinq objets se chevauchent, les paires (haut/bas) doivent-elles être dessinées de bas en haut ou de haut en bas ?


Je dois dessiner en couches, dans l'ordre (zorder), de bas en haut, car je dois partir du principe que je ne sais pas quels pixels des cinq objets vont se croiser. Comme sur une vraie toile.

Après le mélange, cela ressemble à ceci


 
Andrey Barinov:

Je dessine en couches, selon un ordre (comme le zorder), du bas vers le haut, parce qu'il n'est pas immédiatement clair quels pixels des cinq objets vont se chevaucher. Comme sur une vraie toile.

Après avoir mélangé le tout, vous obtenez quelque chose comme ça.

C'est génial ! Utilisez-vous CCanvas ou s'agit-il de votre propre solution ? Quelle approche est la meilleure à long terme ?

 
fxsaber:

Super ! Utilisez-vous un CCanvas raffiné ou une solution entièrement personnelle ? Quelle approche est la meilleure à long terme ?


J'ai dû écrire mon propre code, mais avec d'importants extraits de code empruntés à la bibliothèque standard (algorithmes de dessin primitifs, anticrénelage, etc.). Il s'est avéré plus facile d'intégrer des morceaux de code dans mon concept de travail avec les graphiques que d'envelopper mon concept autour de la bibliothèque standard.

Cela ne me dérangerait pas d'utiliser la bibliothèque standard si elle était "vivante", mais jusqu'à présent, elle n'est pas du tout adaptée aux interfaces graphiques.

 
Andrey Barinov:

J'ai dû écrire mon propre code, mais en empruntant des morceaux de code à la bibliothèque standard (algorithmes de dessin primitifs, anticrénelage, etc.). Il s'est avéré plus facile d'intégrer des morceaux de code dans mon concept de travail avec les graphiques que d'envelopper mon concept autour de la bibliothèque standard.

Cela ne me dérangerait pas d'utiliser la bibliothèque standard, si elle était "vivante", mais jusqu'à présent elle n'est pas adaptée à l'interface graphique de quelque manière que ce soit.

Je vois maintenant, merci.

 
Bug de la langue
#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
}
 
fxsaber:
Bug de la langue

Un bug dans le code utilisateur n'est pas un bug : la méthode InitIndicators(CIndicator *) est manquante.