색상을 음영으로 분해하는 기능. - 페이지 14

 
Yury Kulikov :


색상 0,0,0 및 255,255,255에서 알고리즘을 테스트합니다.

지금 확인하겠습니다.

 
Yury Kulikov :


색상 0,0,0 및 255,255,255에서 알고리즘을 테스트합니다.

확인했습니다. 0,0,0, - 오류가 발생합니다. EA가 언로드 중입니다.

255,255,255 괜찮습니다.

관찰해 주셔서 감사합니다. 나는 이것을 정리할 것이다.

 
Реter Konow :

무슨 소리야, 니콜라스?

당신은 아무것도에 대해 많은 소음을 냈다는 것을 인정할 수 있습니까? 예, 알고리즘이 귀하보다 느릴 수 있으며 몇 가지 버그가 있습니다. 아직 MT5에서 디버깅되지 않았습니다. 하지만 그는 일한다.

이 코드가 무엇인지 이해하십니까?

 //-----------------------------------------------
   if (Старшая_компонента == Исходный_R)R = Старшая_компонента;
   if (Старшая_компонента == Исходный_G)G = Старшая_компонента;
   if (Старшая_компонента == Исходный_B)B = Старшая_компонента;
//------------------------
   if (Средняя_компонента == Исходный_R)R = Средняя_компонента;
   if (Средняя_компонента == Исходный_G)G = Средняя_компонента;
   if (Средняя_компонента == Исходный_B)B = Средняя_компонента;
//------------------------
   if (Младшая_компонента == Исходный_R)R = Младшая_компонента;
   if (Младшая_компонента == Исходный_G)G = Младшая_компонента;
   if (Младшая_компонента == Исходный_B)B = Младшая_компонента;

이것과 100% 동일:

R = Исходный_R;
G = Исходный_G;
B = Исходный_B;

그 후에 코드가 훨씬 더 느리게 작동하는 이유에 더 이상 놀라지 않아도 됩니다.

 
Реter Konow :

255,255,255 괜찮습니다.

이것은 "창문 차양"의 99%와 일치합니까?

 
Yury Kulikov :

나는 "고발"에 합류 할 것입니다, 나는 그것을 참을 수 없었습니다 :)

프로그래밍하지 않는 방법의 좋은 예입니다. 전체 GUI가 이런 식으로 작성되면 곧 볼 수 없습니다. :(

모든 라인은 "걸작"입니다. 오류와 실수의 덩어리, mql4가 그것을 제거하기를 희망합니다. 이제 MT4가 사용되는 이유가 명확해졌습니다.

그런 코드의 공개와 그에 따른 비판에 대한 반응은 포럼의 청중을 존중하는 것이 아니라고 생각합니다. 당신은 피해를 원하지 않습니다 - 그들은 당신을 돕고 싶어합니다.

그리고 알고리즘 비교에 대해서는 시각적으로 비교할 수 있습니다. 알고리즘이 "Windows 음영"에 99% 가까운 음영을 제공한다는 숫자의 증거를 제공하지 않았습니다.

왼쪽 - 접근하는 것처럼 오른쪽 - Nikolai Semko . (수정된 Nikolai Semko 스크립트가 사용되었습니다)


문제의 본질을 이해하고 좋은 본보기를 보여주신 유리님 감사합니다. 변경 후 내 코드가 더 보기 좋아졌습니다.

약간의 설명:

 int x; //индекс исходного цвета в массиве оттенков
if (_mode== 0 ) x=(clr.x[ ArrayMaximum (clr.x, 0 , 3 )]+clr.x[ ArrayMinimum (clr.x, 0 , 3 )])/ 2 ; // Светлота= (MAX+MIN)/2  Вариант из https://ru.wikipedia.org/wiki/HSL . Тот вариант к которому изначально стремился Петр.
if (_mode== 1 ) x=( int ) round ((clr.rgb.b+clr.rgb.g+clr.rgb.r)/ 3.0 ); // мой вариант, который мне кажется более логичным и правильным
if (_mode== 2 ) x= 127 ;                                             // То, что в результате получилась у Петра из-за его алгоритмической путаницы. У него цветовой "сгусток" не гуляет, а стоит ровно по центру.
 
Nikolai Semko :

문제의 본질을 이해하고 좋은 본보기를 보여주신 유리님 감사합니다. 변경 후 내 코드가 더 보기 좋아졌습니다.

약간의 설명:

아마도 그렇게 :)

 int ColorShades( uint _clr, uint & _shades[], int _mode= 0 )
{
   SuintRGB clr;
   if ( ArrayResize (_shades, 256 )!= 256 ) return (- 1 );   //ошибка resize()
   clr.clr=_clr; 
   int x; //индекс исходного цвета в массиве оттенков
   if (_mode== 0 ) x=( ArrayMaximum (clr.x, 3 )+ ArrayMinimum (clr.x, 3 ))/ 2 ; // Светлота= (MAX+MIN)/2  Вариант из https://ru.wikipedia.org/wiki/HSL. Тот вариант к которому изначально стремился Петр.
   else if (_mode== 1 ) x=( int ) round ((clr.rgb.b+clr.rgb.g+clr.rgb.r)/ 3.0 ); // мой вариант, который мне кажется более логичным и правильным
   else x= 127 ;                                             // То, что в результате получилась у Петра из-за его алгоритмической путаницы. У него цветовой "сгусток" не гуляет, а стоит ровно по центру.
   double d, kr, kg, kb;
   if (x> 0 )
   {
       //движение от черного
      d= double (x);
      kr=clr.rgb.r/d;          
      kg=clr.rgb.g/d;
      kb=clr.rgb.b/d;
       for ( int i= 0 ; i<=x; i++)
      {
         clr.rgb.r=( uchar ) fmin ( 255 ,kr*i);
         clr.rgb.g=( uchar ) fmin ( 255 ,kg*i);
         clr.rgb.b=( uchar ) fmin ( 255 ,kb*i);
         _shades[i]=clr.clr;
      }
   }
   if (x< 255 )
   {
       //движение от белого
      d= double ( 255 -x);
      kr=( 255 -clr.rgb.r)/d;
      kg=( 255 -clr.rgb.g)/d;
      kb=( 255 -clr.rgb.b)/d;
       for ( int i= 255 , j= 0 ; i>x; i--, j++)
      {
         clr.rgb.r=( uchar ) fmax ( 0 , 255.0 -kr*j);
         clr.rgb.g=( uchar ) fmax ( 0 , 255.0 -kg*j);
         clr.rgb.b=( uchar ) fmax ( 0 , 255.0 -kb*j);
         _shades[i]=clr.clr;
      }
      if(x==0) _shades[0]=0;
   }
   return (x);
}
 
Nikolai Semko :

이 코드가 무엇인지 이해하십니까?

이것과 100% 동일:

그 후에 코드가 훨씬 더 느리게 작동하는 이유에 더 이상 놀라지 않아도 됩니다.

글쎄, 이것은 이미 내 알고리즘의 오해에서 비롯된 어리 석음입니다.

 
Yury Kulikov :

아마도 그렇게 :)

글쎄요.
제가 처음에 실수를 해서 이전 포스팅에서 수정했습니다.

 if (_mode== 0 ) x=(clr.x[ ArrayMaximum (clr.x, 0 , 3 )]+clr.x[ ArrayMinimum (clr.x, 0 , 3 )])/ 2 ;
 
Yury Kulikov :

이것은 "창문 차양"의 99%와 일치합니까?

예, 오류가 있습니다. 나는 눈치채지 못했다. 색상이 회색 범위에 속하지만 범위의 중간으로 갈수록 흰색에 도달합니다. 따라서 흰색으로 점차적으로 이동해야합니다.

 
Nikolai Semko :

...

그 후에는 코드가 훨씬 느리게 실행되는 이유에 더 이상 놀라지 않아도 됩니다.

일반적으로 다른 사람의 입증된 코드를 가져와서 그 흠잡을 데 없이 자신이 얼마나 더 나은지 다른 사람(자신의 생각으로 솔루션을 찾고 있는 사람)에게 표시하는 것이 편리합니다. 그렇지 않니, 니콜라스?