色を色合いに分解する機能。 - ページ 17

 

さて、もうこの辺でサークルはおしまいです。私のアルゴリズムのバグや問題点の発見にご協力いただいた皆様、本当にありがとうございました。ニコライさん、そして間違いを指摘してくれたユーリ・クリコフさん、ありがとうございました。

可視化アルゴリズムを提供してくれたNikolayに感謝します。

私はコードを改良し、新しいより良いバージョンをここに掲載するつもりです。私のコードが誰かの役に立つことを願っています。


ZS.さんに腐った卵を投げつけたくなる気持ちはわかりますが、控えましょう)))

 
Реter Konow:

では、デルタのことを詳しく教えてください。なぜか。どうやって。そうすれば、あなたが自分で考え出したものだとわかるからです。

意味がわからない ふざけてるのか?

書きました。

deltaR=(R2-R1)/(size-1);

まあ、数式以外で言えばいいんですけどね。

デルタRは、2色のR成分の差を必要なグラデーション数で割ったものに相当します。

色の直線的な変化に興味があるので、通常の直線の式になります。

y= a+b*x となります。

当方の場合

текущая_составляющая_цветаR = составляющая_R_ цвета1 + дельта_R * номер_текущего_элемента_массива;
текущая_составляющая_цветаG = составляющая_G_ цвета1 + дельта_G * номер_текущего_элемента_массива;
текущая_составляющая_цветаB = составляющая_B_ цвета1 + дельта_B * номер_текущего_элемента_массива;
 
Реter Konow:

さて、もうこの辺でサークルはおしまいです。私のアルゴリズムのバグや問題点の発見にご協力いただいた皆様、本当にありがとうございました。ニコライさん、そして間違いを指摘してくれたユーリ・クリコフさん、ありがとうございました。

可視化アルゴリズムを提供してくれたNikolayに感謝します。

私はコードを改良し、新しいより良いバージョンをここに掲載するつもりです。私のコードが誰かの役に立つことを願っています。

ZS.さんに腐った卵を投げつけたくなる気持ちはわかりますが、控えましょう)))

同感です!ただ、急にコードが必要になった場合、百行のスプロールではなく、十数行のニコライのコードを取りましょう)。

 
一見まともな人々が、トピックスターターの挑発に乗り続けることに、私は驚きを隠せません。彼はただ話をしたいだけなんだ!
 
Andrey Khatimlianskii:
一見、適当な人が、話題提供者の挑発に乗り続けることに驚きを禁じ得ない。彼はただ話をしたいだけなんだ!
アンドリュー、君は僕をからかったね。:)
実際、色の塊がなく、色の歪みが少ないカラーパレットを 得るのは面白い作業です。当然ながら、色成分間のデルタは一定ではなく、滑らかに変化することが望ましい。上記の例では、黒からと白からの2つの値を持っています。だから、心に残ったんです。
 
Andrey Khatimlianskii:
一見、適当な人がトピックスターターの挑発に乗り続けることに、私は驚きを禁じえません。彼はただ話をしたいだけなんだ!

不思議に思わないんですね。説明すればわかってもらえる。

  1. 無意識のうちに反射的に、見慣れない形を攻撃 してしまうのだ。目に見える形が規格外で、この世界に自分の居場所を主張するならば--それは破壊されなければならない。なぜ?- 理由は2つ。

  • 非標準の形は、標準の世界を脅かすものです。
  • 非標準的な形 - 弱さ、不完全さ、退化の兆候である可能性があります。

どうやらこの反射は、すべての人の潜在意識に存在するようだ。私は、プログラミングにおける型破りなものの代表格なのです。型破りなアプローチ、型破りなスタイル。だから、ある人は無意識のうちに、私を自分の描く世界を脅かす存在と見ているし、ある人は私を弱点と見ている。どちらの場合も、自分の立場を「攻撃」して壊したいという誘惑がある。自分の「点数」を増やしたいという気持ちが、モチベーションを高めているのです。

しかし、(私が提示している)型破りな形は、弱さや劣化だけでなく、驚異的な強さや能力の表れでもあるのです。この場合、非標準のFormが新しい標準であると主張することができます。


2.無意識のうちに「形=本質」という結論が引き出されているのです。多くの人は、「形」で「本質」を判断します。形が荒唐無稽、滑稽に見えるなら、本質もまた然りである。これが優れた頭脳の証でないことは誰もが知っていることだが、私たちはこの固定観念に縛られている。

最初のページでは、私のコンセプトのエッセンスを詳しく説明しました。しかし、相手はそれを良しとしなかった。彼らはすぐにフォームに固執した。ある特定のアルゴリズムについて。悪い、ばかばかしい、遅いと言われた。私のアルゴリズムを壊すだけで、私の立場は崩壊すると判断したのです。しかし、彼らは私がアルゴリズムに込めた思いを理解していないため、私のアルゴリズムを批判することで、より良いものにする手助けをしてくれただけなのです。同時に、色の分解原理という エッセンスも残っています。

もし相手がアルゴリズムではなく、私のコンセプトを破壊していたら、彼らは成功していたでしょう。だから、私の方が強いんです。

上記はすべて、相手との他の矛盾に関係しています。彼らは私のアイデアを実装の形で判断し、本質を見ようとしない。それが変わらない限り、私は常に勝ち続けるだろう。私の立場を崩したいのですか?- 私のコンセプトを、私が作ったのと同じレベルで、粉々に吹き飛ばすのです。しかし、それは実装の形で戦うよりも難しいことなのです。

 
Реter Konow:

不思議に思わないんですね。説明すれば、きっとわかってもらえるはずです。

...

ピーター、あなたは風車と戦っているのです。まあ、もうひとつの選択肢として、あなたはエルーシブ・ジョーであり、そのために必要なすべてを備えているのです)

 
Реter Konow:



mql5の動作確認済みコードはどこですか?

 
Nikolai Semko :


動作するmql5コードはどこにありますか?

 //+------------------------------------------------------------------+
//|                                              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 ()); }
   double d= 5 ;
   uint 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);
       //Gradient(C.clr,Gradient,256);
      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));
         canvas.LineHorizontal( 0 , 767 ,y, ColorToARGB (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();
//------------------------
  }
//+------------------------------------------------------------------+
//================================================================================================================================================================
void Диапазон_оттенков( color _Цвет, uint &Все_оттенки[])
{
 color R = 0 , G = 0 ,  B = 0 ;
 int    q = 0 , w1 = 0 , w2 = 0 ;
 //------------------------------------------------------
 uint Этот_цвет;
 double Тангенс_угла_старшего_треугольника_1,      
        Тангенс_угла_среднего_треугольника_1,                  
        Тангенс_угла_младшего_треугольника_1,                       
        Значение_в_точке_преломления_старшей_компоненты,  
        Значение_в_точке_преломления_средней_компоненты,
        Значение_в_точке_преломления_младшей_компоненты,    
        Тангенс_угла_старшего_треугольника_2,
        Тангенс_угла_среднего_треугольника_2,    
        Тангенс_угла_младшего_треугольника_2;
 //------------------------------------------------------
 double pi = 3.1415926536 ,
        Comp_1,Comp_2,Comp_3,
         //-----------------------------------------------
        Первая_компонента = 0.0 ,
        Вторая_компонента = 0.0 ,
        Третья_компонента = 0.0 ,
         //-----------------------------------------------
        Исходный_R = GetR(_Цвет), 
        Исходный_G = GetG(_Цвет),  
        Исходный_B = GetB(_Цвет),  
         //-----------------------------------------------
        Старшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 2 ), 
        Средняя_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 1 ), 
        Младшая_компонента         = Нужная_компонента(Исходный_R,Исходный_G,Исходный_B, 0 ), 
         //-----------------------------------------------
        Координата_исходного_цвета = Старшая_компонента/ tan (( 63.43989 *pi)/ 180 ) + Младшая_компонента/ 2 ; 
         //-----------------------------------------------
        
 //-----------------------------------------------
 if (Старшая_компонента == Исходный_R)R = ( color )Старшая_компонента;
 if (Старшая_компонента == Исходный_G)G = ( color )Старшая_компонента; 
 if (Старшая_компонента == Исходный_B)B = ( color )Старшая_компонента;     
 //------------------------
 if (Средняя_компонента == Исходный_R)R = ( color )Средняя_компонента;
 if (Средняя_компонента == Исходный_G)G = ( color )Средняя_компонента; 
 if (Средняя_компонента == Исходный_B)B = ( color )Средняя_компонента; 
 //------------------------
 if (Младшая_компонента == Исходный_R)R = ( color )Младшая_компонента;
 if (Младшая_компонента == Исходный_G)G = ( color )Младшая_компонента; 
 if (Младшая_компонента == Исходный_B)B = ( color )Младшая_компонента; 
 //------------------------------------------------
   
 //==========================================================================================
 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 (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------
       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;
       //---------------------------------------------------
       Все_оттенки[a1] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента));
       //---------------------------------------------------------------------------    
       w1++;
      }
     //------------------------------------------------------------------------------
     for ( int a2 = 255 ; a2 >= w1; 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 (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------       
       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;
       //---------------------------------------------------
       Все_оттенки[a2] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента)); 
       //---------------------------------------------------------------------------
       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 (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------
       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;
       //---------------------------------------------------
       Все_оттенки[b1] = StringToColor (( string ) MathRound (Первая_компонента) + "," + ( string ) MathRound (Вторая_компонента) + "," + ( string ) MathRound (Третья_компонента));
       //---------------------------------------------------------------------------    
       w2++;
      }
     //------------------------------------------------------------------------------
     for ( int b2 = 255 ; b2 >= w2; 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 (Comp_1 < 0 )Comp_1 = 0 ;
       if (Comp_2 < 0 )Comp_2 = 0 ;
       if (Comp_3 < 0 )Comp_3 = 0 ;           
       //---------------------------------------------------       
       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;
       //---------------------------------------------------
       Этот_цвет = StringToColor (( 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);
 //----------------------------------------------
 return (Components[Index]);
}
//=============================================================================
 
Nikolai Semko:


mql5の動作確認済みコードはどこですか?

R = Source_R」はその通りなのですが、その方がアルゴリズムの仕組みが分かりやすいので、そのままにしています。

まだアルゴリズムに工夫が必要です。完璧ではありません。もしかしたら、私もいずれあなたと同じようなアルゴリズムを思いつくかもしれません。でも、わざわざ行くことで、比べものにならないくらい多くのものを手に入れることができるのです。結局のところ、私は知識と理解の道を通るので、誰かの解決策をただコピーするよりも、アルゴリズムの創造的な範囲はずっと広くなるのです。だから、私はいつも自分の道を選びます。