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

 
Реter Konow :

다음은 MT5에 대한 내 알고리즘의 결과입니다. 불필요하고 불필요한 장식이 없습니다.


코드는 어떻습니까?

 
Nikolai Semko :

나는 이미 의 접근 방식의 단점을 설명했으며 비교하는 팔레트와 일치하면 흰색 선을 예로 사용하여 역시 마찬가지입니다.
다시 말해서.

특정 색상(r1,g1,b1)을 거쳐 검정색(0,0,0)에서 흰색(255,255,255)으로 색상을 매끄럽게 바꾸면 중요한 지표는 R,G,B 3색의 합입니다. 여기 용어에서 벗어나는 것이 좋습니다. 당신은 그것에 혼란스러워 할 수 있습니다 (밝기, 가벼움, 톤 ....)

이상적으로는 이 표시기가 0에서 3*255=765로 선형적으로 변경되어야 한다는 것이 절대적으로 분명합니다. 색상을 중간에서 엄격하게 벗겨내지만 먼저 원래 색상의 합을 계산하고 RGB 합에 따라 그라디언트 배열에 삽입합니다. 따라서 내 흰색 선에는 당신과 달리 중단점이 없습니다.

Nikolai, 알고리즘의 원리를 설명하고 이와 같아야 하지만 다르지 않은 일종의 흰색 선에 대해 이야기할 때까지...

알고리즘이 어떻게 음영으로 분해되는지 이해하지 못하는 것이 분명합니다. 당신은 전체적인 개념이 없습니다. 어딘가에서 빌린 용어와 코드의 혼란 만 ...

 
Nikolai Semko :

코드는 어떻습니까?

아직 모든 것이 준비된 것은 아닙니다. 인정합니다. 플랫폼 간의 차이를 과소평가했습니다. MT5의 알고리즘이 일부 장소에서 작동하고 있습니다. 그러나 문제는 개념이 아니라 코드에만 있습니다.

 
Реter Konow :

Nikolai, 알고리즘의 원리를 설명하고 이와 같아야 하지만 다르지 않은 일종의 흰색 선에 대해 이야기할 때까지...

알고리즘이 어떻게 음영으로 분해되는지 이해하지 못하는 것이 분명합니다. 당신은 전체적인 개념이 없습니다. 어딘가에서 빌린 용어와 코드의 혼란 만 ...

피터, 무슨 소리야? 내가 이해하지 못했다면 어떻게 할 수 있습니까? 알고리즘을 코드로 작성하는 것은 말로 설명하는 것보다 훨씬 쉽습니다.
자, 이 코드의 의미를 이해하셨습니까? 결국, 모든 것이 너무 기초적이고 명확하여 여기에 어떤 주석을 삽입 할 수 있는지조차 이해하지 못합니다.

 void Gradient( uint clr1, uint clr2, uint &arr[], uint size)
  {
   if (size== 0 ) return ;
   ArrayResize (arr,size);
   rgb c1,c2;
   c1.clr=clr1;
   c2.clr=clr2;
   double R1=c1.c[ 2 ],G1=c1.c[ 1 ],B1=c1.c[ 0 ];
   double R2=c2.c[ 2 ],G2=c2.c[ 1 ],B2=c2.c[ 0 ];
   double deltaR=(R2-R1)/(size- 1 );
   double deltaG=(G2-G1)/(size- 1 );
   double deltaB=(B2-B1)/(size- 1 );
   for ( uint i= 0 ;i<size;i++)
     {
      R1+=deltaR; c1.c[ 2 ]= uchar (R1+ 0.4999 );
      G1+=deltaG; c1.c[ 1 ]= uchar (G1+ 0.4999 );
      B1+=deltaB; c1.c[ 0 ]= uchar (B1+ 0.4999 );
      arr[i]=c1.clr;
     }
  }
 
Nikolai Semko :

피터, 무슨 소리야? 내가 이해하지 못했다면 어떻게 할 수 있습니까? 알고리즘을 코드로 작성하는 것은 말로 설명하는 것보다 훨씬 쉽습니다.
자, 이 코드의 의미를 이해하셨습니까? 결국, 모든 것이 너무 기초적이고 명확하여 여기에 어떤 주석을 삽입 할 수 있는지조차 이해하지 못합니다.

이 함수를 예로 사용하여 알고리즘이 작동하는 방식은 다음과 같습니다.

 #include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164

union rgb { uint clr; uchar c[ 4 ];};

void OnStart ()
  {
   rgb c,C;
   uint CLR[];
   color clr= clrViolet ;
   Gradient( clrWhite , clr, CLR,W.Height/ 2 ); // получаем массив градиента от белого цвета до цвета clr 
   for ( int y= 0 ; y<W.Height/ 2 ; y++) Canvas.LineHorizontal( 0 ,W.Width- 1 ,y, ColorToARGB (CLR[y], 240 )); // выводим на экран
   Gradient(clr, clrBlack , CLR,W.Height-W.Height/ 2 ); // получаем массив градиента от цвета clr до черног цвета  
   for ( int y=W.Height/ 2 ; y<W.Height; y++) Canvas.LineHorizontal( 0 ,W.Width- 1 ,y, ColorToARGB (CLR[y-W.Height/ 2 ], 240 )); // выводим на экран в продолжение предыдущего
   Canvas.Update();
   Sleep ( 30000 );
   }
//+------------------------------------------------------------------+

void Gradient( uint clr1, uint clr2, uint &arr[], uint size)
  {
   if (size== 0 ) return ;
   ArrayResize (arr,size);
   rgb c1,c2;
   c1.clr=clr1;
   c2.clr=clr2;
   double R1=c1.c[ 2 ],G1=c1.c[ 1 ],B1=c1.c[ 0 ];
   double R2=c2.c[ 2 ],G2=c2.c[ 1 ],B2=c2.c[ 0 ];
   double deltaR=(R2-R1)/(size- 1 );
   double deltaG=(G2-G1)/(size- 1 );
   double deltaB=(B2-B1)/(size- 1 );
   for ( uint i= 0 ;i<size;i++)
     {
      R1+=deltaR; c1.c[ 2 ]= uchar (R1+ 0.4999 );
      G1+=deltaG; c1.c[ 1 ]= uchar (G1+ 0.4999 );
      B1+=deltaB; c1.c[ 0 ]= uchar (B1+ 0.4999 );
      arr[i]=c1.clr;
     }
  }


 
Nikolai Semko :

피터, 무슨 소리야? 내가 이해하지 못했다면 어떻게 할 수 있습니까? 알고리즘을 코드로 작성하는 것은 말로 설명하는 것보다 훨씬 쉽습니다.
자, 이 코드의 의미를 이해하셨습니까? 결국, 모든 것이 너무 기초적이고 명확하여 여기에 어떤 주석을 삽입 할 수 있는지조차 이해하지 못합니다.

색상 분해의 개념을 기술하십시오. 알고리즘이 당신의 것이라면 당신은 그것을 잘 알고 있습니다.

 
Реter Konow :

뭔가 확신을 가지려고 하는 것 같습니다. 반복합니다. 시각화를 할 시간이 없었습니다. 팔레트에 대해 알고리즘을 확인했습니까?

색상 207,255,65에 대한 스크립트 결과

색상 207,255,65에 대한 스크립트 결과입니다.

 
Yury Kulikov :

색상 207,255,65에 대한 스크립트의 결과입니다.

시청 해주셔서 감사합니다. 또한 몇 가지 버그를 발견했습니다. 이제 MT4로 GIF를 만들어 보겠습니다. 잘 작동하지만 몇 가지 색상에 문제가 있습니다.

 

고화질 gif를 못 구합니다. 여기 스크립트가 있습니다. MT4를 착용하고 모든 것을 있는 그대로 보십시오.

 //+------------------------------------------------------------------+
//|                                              Gradient test 1.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
union rgb { uint clr; uchar c[ 4 ];};
rgb C,cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   CCanvas canvas;
   if (!canvas.CreateBitmapLabel( "Gradient" , 200 , 200 , 768 , 256 , COLOR_FORMAT_ARGB_NORMALIZE )) { Print ( "Error creating canvas: " , GetLastError ()); }
   string Main_color = C'190,215,160' ;
   double d= 5 ;
   string Gradient[ 256 ];

   while (! IsStopped ())
     {
      C.c[ 2 ]= uchar ( 127.5 *( 1 + sin (d* 1.2 ))+ 0.4999 ); C.c[ 1 ]= uchar ( 127.5 *( 1 + sin (d* 1.9 ))+ 0.4999 ); C.c[ 0 ]= uchar ( 127.5 *( 1 + sin (d* 2.8 ))+ 0.4999 );   // генерируем новый цвет
      cc.clr=C.clr;
       ulong t= GetMicrosecondCount ();
      Диапазон_оттенков(C.clr,Gradient); //Диапазон_оттенков(Main_color,Gradient);
      t= GetMicrosecondCount ()-t;
       for ( int y= 0 ; y< 256 ; y++)
        {
         //Alert(__FUNCTION__,"  Gradient[",y,"]  ",Gradient[y]);
         canvas.LineHorizontal( 0 , 767 ,y, ColorToARGB ( StringToColor (Gradient[y]), 255 ));
         C.clr=Gradient[y];
         canvas.PixelSet(( int )C.c[ 2 ]+( int )C.c[ 1 ]+( int )C.c[ 0 ],y, ColorToARGB ( clrWhite ));
         if (C.c[ 1 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 2 ]/( double )C.c[ 1 ]+ 50.0 *( int )C.c[ 0 ]/( double )C.c[ 1 ]),y, ColorToARGB ( clrGreen ));
         if (C.c[ 2 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 1 ]/( double )C.c[ 2 ]+ 50.0 *( int )C.c[ 0 ]/( double )C.c[ 2 ]),y, ColorToARGB ( clrRed ));
         if (C.c[ 0 ]> 0 ) canvas.PixelSet( int ( 50.0 *( int )C.c[ 2 ]/( double )C.c[ 0 ]+ 50.0 *( int )C.c[ 1 ]/( double )C.c[ 0 ]),y, ColorToARGB ( clrBlue ));
        }
      canvas.FillRectangle( 500 , 75 , 660 , 150 , ColorToARGB (cc.clr, 240 ));
      canvas.FontSet( "Tahoma" , 20 ); 
      canvas. TextOut ( 510 , 85 , "R = " + string (cc.c[ 2 ]), ColorToARGB (~cc.clr)); 
      canvas. TextOut ( 510 , 107 , "G = " + string (cc.c[ 1 ]), ColorToARGB (~cc.clr)); 
      canvas. TextOut ( 510 , 129 , "B = " + string (cc.c[ 0 ]), ColorToARGB (~cc.clr));
      canvas.FontSet( "Times New Roman" , 15 );
      canvas. TextOut ( 300 , 10 , "Время формирования градиентного массива из 256 элементов = " + string (t)+ " микросекунд" , ColorToARGB ( clrWhite ));
      canvas.Update();
      d+= 0.01 ;
       Sleep ( 30 );
     }
   canvas.Destroy();
//------------------------
// for(int a1 = 0; a1 < 256; a1++)Alert(__FUNCTION__,"  Gradient[",a1,"]  ",Gradient[a1]);
  }
//+------------------------------------------------------------------+
//================================================================================================================================================================
void Диапазон_оттенков( color _Цвет, string &Все_оттенки[ 256 ])
{
 color R,G,B,q;
 //------------------------------------------------------
 string Этот_цвет;
 double Тангенс_угла_старшего_треугольника_1,      
        Тангенс_угла_среднего_треугольника_1,                  
        Тангенс_угла_младшего_треугольника_1,                       
        Значение_в_точке_преломления_старшей_компоненты,  
        Значение_в_точке_преломления_средней_компоненты,
        Значение_в_точке_преломления_младшей_компоненты,    
        Тангенс_угла_старшего_треугольника_2,
        Тангенс_угла_среднего_треугольника_2,    
        Тангенс_угла_младшего_треугольника_2;
 //------------------------------------------------------
 double pi = 3.1415926536 ,
        Comp_1,Comp_2,Comp_3,
         //-----------------------------------------------
        Первая_компонента,
        Вторая_компонента,
        Третья_компонента,
         //-----------------------------------------------
        Исходный_R = GetR(_Цвет), 
        Исходный_G = GetG(_Цвет),  
        Исходный_B = GetB(_Цвет),  
         //-----------------------------------------------
        Старшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 0 ), 
        Средняя_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 1 ), 
        Младшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 2 ), 
         //-----------------------------------------------
        Координата_исходного_цвета = Старшая_компонента/ tan (( 63.43989 *pi)/ 180 ) + Младшая_компонента/ 2 ; 
         //-----------------------------------------------
        
 //-----------------------------------------------
 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 = Младшая_компонента;     
 //==========================================================================================
 if (Координата_исходного_цвета <= 127 )
   {
    Тангенс_угла_старшего_треугольника_1  = Старшая_компонента/Координата_исходного_цвета;
    Тангенс_угла_среднего_треугольника_1  = Средняя_компонента/Координата_исходного_цвета;     
    Тангенс_угла_младшего_треугольника_1  = Младшая_компонента/Координата_исходного_цвета;
     //-----------------------------------------------
    Значение_в_точке_преломления_старшей_компоненты  = Тангенс_угла_старшего_треугольника_1* 128 ;
    Значение_в_точке_преломления_средней_компоненты  = Тангенс_угла_среднего_треугольника_1* 128 ;
    Значение_в_точке_преломления_младшей_компоненты  = Тангенс_угла_младшего_треугольника_1* 128 ;    
     //-----------------------------------------------    
    Тангенс_угла_старшего_треугольника_2  = ( 255 - Значение_в_точке_преломления_старшей_компоненты)/ 128 ;
    Тангенс_угла_среднего_треугольника_2  = ( 255 - Значение_в_точке_преломления_средней_компоненты)/ 128 ;       
    Тангенс_угла_младшего_треугольника_2  = ( 255 - Значение_в_точке_преломления_младшей_компоненты)/ 128 ;
     //-----------------------------------------------    
     for ( int a1 = 0 ; a1 < 128 ; a1++)
      {
       Comp_1 = Тангенс_угла_старшего_треугольника_1*a1;
       Comp_2 = Тангенс_угла_среднего_треугольника_1*a1;
       Comp_3 = Тангенс_угла_младшего_треугольника_1*a1;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       //---------------------------------------------------
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Этот_цвет = ( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента);
       //---------------------------------------------------------------------------    
       Все_оттенки[a1] = Этот_цвет; 
       //---------------------------------------------------------------------------
      }
     //------------------------------------------------------------------------------
     for ( int a2 = 255 ; a2 >= a1; a2--)
      {
       Comp_1 = 255 - Тангенс_угла_старшего_треугольника_2*q;
       Comp_2 = 255 - Тангенс_угла_среднего_треугольника_2*q;
       Comp_3 = 255 - Тангенс_угла_младшего_треугольника_2*q;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       //---------------------------------------------------       
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Этот_цвет = ( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента);
       //---------------------------------------------------------------------------    
       Все_оттенки[a2] = Этот_цвет; 
       //---------------------------------------------------------------------------
       q++;
      }
  } 
 //------------------------------------------------------------------------------
 if (Координата_исходного_цвета > 127 )
   {
    Тангенс_угла_старшего_треугольника_1  = ( 255 - Старшая_компонента)/( 255 - Координата_исходного_цвета);
    Тангенс_угла_среднего_треугольника_1  = ( 255 - Средняя_компонента)/( 255 - Координата_исходного_цвета);       
    Тангенс_угла_младшего_треугольника_1  = ( 255 - Младшая_компонента)/( 255 - Координата_исходного_цвета);
     //-----------------------------------------------
    Значение_в_точке_преломления_старшей_компоненты  = 255 - (Тангенс_угла_старшего_треугольника_1* 128 );
    Значение_в_точке_преломления_средней_компоненты  = 255 - (Тангенс_угла_среднего_треугольника_1* 128 );
    Значение_в_точке_преломления_младшей_компоненты  = 255 - (Тангенс_угла_младшего_треугольника_1* 128 );    
     //-----------------------------------------------    
    Тангенс_угла_старшего_треугольника_2  = Значение_в_точке_преломления_старшей_компоненты/ 128 ;
    Тангенс_угла_среднего_треугольника_2  = Значение_в_точке_преломления_средней_компоненты/ 128 ;      
    Тангенс_угла_младшего_треугольника_2  = Значение_в_точке_преломления_младшей_компоненты/ 128 ;
     //-----------------------------------------------    
     for ( int b1 = 0 ; b1 < 128 ; b1++)
      {
       Comp_1 = Тангенс_угла_старшего_треугольника_2*b1;
       Comp_2 = Тангенс_угла_среднего_треугольника_2*b1;
       Comp_3 = Тангенс_угла_младшего_треугольника_2*b1;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       //---------------------------------------------------
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Этот_цвет = ( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента);
       //---------------------------------------------------------------------------    
       Все_оттенки[b1] = Этот_цвет; 
       //---------------------------------------------------------------------------
      }
     //------------------------------------------------------------------------------
     for ( int b2 = 255 ; b2 >= b1; b2--)
      {
       Comp_1 = 255 - Тангенс_угла_старшего_треугольника_1*q;
       Comp_2 = 255 - Тангенс_угла_среднего_треугольника_1*q;
       Comp_3 = 255 - Тангенс_угла_младшего_треугольника_1*q;
       //---------------------------------------------------
       if (Comp_1 > 255 )Comp_1 = 255 ;
       if (Comp_1 > 255 )Comp_2 = 255 ;
       if (Comp_1 > 255 )Comp_3 = 255 ;
       //---------------------------------------------------       
       if (R == Старшая_компонента)Первая_компонента = Comp_1;
       if (R == Средняя_компонента)Первая_компонента = Comp_2;
       if (R == Младшая_компонента)Первая_компонента = Comp_3;
       //---------------------------------------------------
       if (G == Старшая_компонента)Вторая_компонента = Comp_1;
       if (G == Средняя_компонента)Вторая_компонента = Comp_2;
       if (G == Младшая_компонента)Вторая_компонента = Comp_3;
       //---------------------------------------------------
       if (B == Старшая_компонента)Третья_компонента = Comp_1;
       if (B == Средняя_компонента)Третья_компонента = Comp_2;
       if (B == Младшая_компонента)Третья_компонента = Comp_3;
       //---------------------------------------------------
       Этот_цвет = ( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента);
       //---------------------------------------------------------------------------    
       Все_оттенки[b2] = Этот_цвет; 
       //---------------------------------------------------------------------------
       q++;
      }
   }   
 //------------------------------------------------------------------------------  
}
//+------------------------------------------------------------------+
//| Получение значения компонента R                                  |
//+------------------------------------------------------------------+
double GetR( const color aColor)
  {
   return (aColor& 0xff );
  }
//+------------------------------------------------------------------+
//| Получение значения компонента G                                  |
//+------------------------------------------------------------------+
double GetG( const color aColor)
  {
   return ((aColor>> 8 )& 0xff );
  }
//+------------------------------------------------------------------+
//| Получение значения компонента B                                  |
//+------------------------------------------------------------------+
double GetB( const color aColor)
  {
   return ((aColor>> 16 )& 0xff );
  }
//--------------------------------------------------------------------
double Нужная_компонента( double C1, double C2, double C3, int Index)
{
 double Components[ 3 ]; 
 //----------------------------------------------
 Components[ 0 ] = C1;
 Components[ 1 ] = C2;
 Components[ 2 ] = C3;
 //----------------------------------------------
 ArraySort (Components, WHOLE_ARRAY , 0 , MODE_DESCEND );
 //----------------------------------------------
 return (Components[Index]);
}
 

첫 번째 오류를 찾았습니다. 수정했습니다.

다음을 추가했어야 합니다.

       if (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;

모든 주기에서.