エラー、バグ、質問 - ページ 2063

 
透明度の高いチャンネルを持つbmpオブジェクトが2つあります。それらが互いに重なり合ったとき、いくつかのuint-colourが生成される。各オブジェクトの重ね合わせピクセルのuint-colourがわかっている場合、これらの値を自分で計算するにはどうすればよいのでしょうか。
 
fxsaber:
透明度の高いチャンネルを持つbmpオブジェクトが2つあります。それらが互いに重なり合ったとき、いくつかのuint-colourが生成される。各オブジェクトの重ね合わせピクセルのuint-colourがわかっている場合、これらの値を自分で計算するにはどうすればよいのでしょうか。

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:

ありがとうございました。もうひとつ質問です。例えば、5つのオブジェクトが同時に重なった場合、そのペア(上/下)はボトムアップとトップダウンのどちらで作るべきでしょうか?

 
fxsaber:

ありがとうございました。


すべての(bmp)オブジェクトを同じキャンバスに一度に描画する方が、長い目で見ればシンプルな方法です。

 
Andrey Barinov:

すべての(bmp)オブジェクトを1つのキャンバスに一度に描画する方が、長い目で見ればシンプルな方法です。

だから聞いているんです。上記は別の質問です。

 
fxsaber:

ありがとうございました。もうひとつ質問です。例えば、5つのオブジェクトが重なっている場合、ペア(上下)は下から上に描くべきか、上から下に描くべきか。


5つのオブジェクトのどのピクセルが交差するかわからないという前提で、下から上へ順番に(zorder)レイヤーで描かなければならないのです。まるで本物のキャンバスに描かれたように。

ミックス後、以下のようになります。


 
Andrey Barinov:

5つのオブジェクトのどのピクセルが重なるのかがすぐには分からないので、下から上へと順番に(zorderのように)レイヤー分けして描いています。まるで本物のキャンバスに描かれたように。

混ぜると、こんな感じになります。

すごいですねぇ。CCanvasを使っているのか、それともすべて自前のソリューションなのか?長い目で見ると、どちらのアプローチが良いのでしょうか?

 
fxsaber:

素晴らしいCCanvasを改良して使っているのですか、それとも完全に独自のソリューションを使っているのですか?長い目で見ると、どちらのアプローチが良いのでしょうか?


自分で書かなければならなかったのですが、標準ライブラリから 借用した重要なコード断片(プリミティブな描画アルゴリズム、アンチエイリアスなど)を使っています。グラフィックスを扱うという私の概念にコードの断片を詰め込むことは、私の概念を標準ライブラリに巻き付けるよりも簡単であることが判明しました。

標準ライブラリが「生きている」なら使ってもいいんだけど、今のところGUIには一切適応していない。

 
Andrey Barinov:

自分で書かなければならなかったのですが、標準ライブラリから コードの一部を大幅に借用しました(プリミティブな描画アルゴリズム、アンチエイリアスなど)。グラフィックスを扱うという私の概念にコードの断片を詰め込むことは、私の概念を標準ライブラリに巻き付けるよりも簡単であることが判明しました。

標準ライブラリが「生きている」なら使ってもいいんだけど、今のところGUIには一切適応していない。

なるほど、ありがとうございます。

 
言語バグ
#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
}