Fehler, Irrtümer, Fragen - Seite 2063

 
Es gibt zwei bmp-Objekte mit Transparenzkanälen. Wenn sie sich überschneiden, werden einige uint-Farben erzeugt. Wie kann ich diese Werte selbst berechnen, wenn ich die uint-Farben der übereinanderliegenden Pixel der einzelnen Objekte kenne?
 
fxsaber:
Es gibt zwei bmp-Objekte mit Transparenzkanälen. Wenn sie sich überschneiden, werden einige uint-Farben erzeugt. Wie kann ich diese Werte selbst berechnen, wenn ich die uint-Farben der übereinanderliegenden Pixel der einzelnen Objekte kenne?

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:

Ich danke Ihnen! Eine andere Frage. Wenn sich z. B. fünf Objekte gleichzeitig überschneiden, sollten die Paare (oben/unten) von unten nach oben oder von oben nach unten gebildet werden?

 
fxsaber:

Ich danke Ihnen!


Es ist besser, alle (bmp)-Objekte auf einmal auf dieselbe Leinwand zu zeichnen, das ist auf lange Sicht einfacher.

 
Andrey Barinov:

Es ist besser, alle (bmp)-Objekte auf einmal auf eine Leinwand zu zeichnen, das ist auf lange Sicht der einfachere Ansatz.

Das ist der Grund für meine Frage. Oben steht eine andere Frage.

 
fxsaber:

Ich danke Ihnen! Eine andere Frage. Wenn sich z. B. fünf Objekte überschneiden, sollen die Paare (oben/unten) von unten nach oben oder von oben nach unten gezeichnet werden?


Ich muss in Schichten zeichnen, in der Reihenfolge (zorder), von unten nach oben, weil ich davon ausgehen muss, dass ich nicht weiß, welche Pixel der fünf Objekte sich überschneiden werden. Wie auf einer echten Leinwand.

Nach dem Mischen sieht es folgendermaßen aus


 
Andrey Barinov:

Ich zeichne in Ebenen, der Reihenfolge nach (wie bei der Z-Reihenfolge), von unten nach oben, denn es ist nicht sofort klar, welche Pixel der fünf Objekte sich überschneiden werden. Wie auf einer echten Leinwand.

Nach dem Mischen erhält man etwa so etwas.

Das ist großartig! Verwenden Sie CCanvas oder ist es Ihre eigene Lösung? Welcher Ansatz ist auf lange Sicht besser?

 
fxsaber:

Großartig! Verwenden Sie ein verfeinertes CCanvas oder eine komplett eigene Lösung? Welcher Ansatz ist auf lange Sicht besser?


Ich musste meinen eigenen Code schreiben, aber mit bedeutenden Codeschnipseln aus der Standardbibliothek (primitive Zeichenalgorithmen, Anti-Aliasing, usw.). Es stellte sich heraus, dass es einfacher war, Code in mein Konzept für die Arbeit mit Grafiken zu packen, als mein Konzept um die Standardbibliothek herum zu wickeln.

Ich hätte nichts dagegen, die Standardbibliothek zu verwenden, wenn sie "live" wäre, aber bisher ist sie in keiner Weise an die GUI angepasst.

 
Andrey Barinov:

Ich musste meinen eigenen Code schreiben, wobei ich mir jedoch einige Teile aus der Standardbibliothek auslieh (primitive Zeichenalgorithmen, Anti-Aliasing usw.). Es stellte sich heraus, dass es einfacher war, Code in mein Konzept für die Arbeit mit Grafiken zu packen, als mein Konzept um die Standardbibliothek herum zu wickeln.

Ich hätte nichts dagegen, die Standardbibliothek zu verwenden, wenn sie "live" wäre, aber bisher ist sie in keiner Weise an die GUI angepasst.

Ich verstehe jetzt, danke.

 
Sprachfehler
#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
}