오류, 버그, 질문 - 페이지 2063

 
투명 채널이 있는 두 개의 bmp 개체가 있습니다. 서로 겹쳐지면 몇 가지 단위 색상이 나타납니다. 각 개체의 중첩 픽셀의 단위 색상을 알고 있다면 이러한 값을 직접 계산하는 방법은 무엇입니까?
 
fxsaber :
투명 채널이 있는 두 개의 bmp 개체가 있습니다. 서로 겹쳐지면 몇 가지 단위 색상이 나타납니다. 각 개체의 중첩 픽셀의 단위 색상을 알고 있다면 이러한 값을 직접 계산하는 방법은 무엇입니까?

 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) 개체를 그리는 것이 더 낫습니다. 장기적으로는 이것이 더 간단한 방법입니다.

이런 이유로 묻습니다. 질문 위에는 또 다른 질문이 있습니다.

 
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
}