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

 
Vladislav Andruschenko:


まあ、英語の名前は理由があって発明されたものですからね。

ロシア語の名前があなたのコードを殺す別の例を挙げることができます。

キリル文字を持っていないお客様にコードをお渡しする。それだけです .................................が全て消えてしまった......。:-)

そして、顧客が必要としているのは、コードなのか、それともソリューションなのか。

 
Реter Konow:

顧客が欲しいのはコードなのかソリューションなのか?

だから、ターゲットやエンドユーザーを決める必要があるんです。

ユーザーの立場になって、今までのことをすべて忘れて、「ユーザーはどう感じるか?

彼または彼女にとって、すべてが意味をなすのだろうか?

 
Vladislav Andruschenko:

だから、ターゲットやエンドユーザーを決める必要があるんです。

ユーザーの立場になって、今までのことをすべて忘れて、「ユーザーはどう感じるか?

その人はすべてを理解できるのだろうか?

私もそう思います。私は2ヶ国語で書いています。純粋に英語でできる。

 
Реter Konow:

英語圏の方は、私の判断を無視していただいて結構です。そこには英単語はほとんどない。

ところで、せっかく英語のコードが得意なのだから、Nikolay Semkoが提案したコードにも手を貸してほしい。

正直、仕組みがよくわからない。英語の短い音節が多いのが特徴です。あなたの好きなものだけでいい。

それは、私が知っている英語は3割程度で、しかも技術的なものだけで、会話はできないことです。

プログラミングの場合、単語は数十個しかなく、文字通り1-2個プログラムを書けば覚えられる。

追伸:投稿されたコード、変数が5つしかないのに、どうしてわからないのでしょうか?

 
Vitaly Muzichenko:

それが、私が知っている英語は3割程度で、しかも技術的なものばかりで、会話はできないんです。

プログラミングでは、単語は数十個しかなく、文字通り1-2個のプログラムを書けば覚えられる。

追伸:投稿されたコード、変数が5つしかないのに、どうしてわからないのでしょうか?

さて、私のコード(main関数内)では、30個の変数を数えました。そして、いくつまで数えますか?(冗談です)。

3割の技術英語はとても強い。技術英語の豊かさを知っていますか?

プログラミングで数十語?今、私たちが理解し合えない理由がわかったよ))。


zyです。ニコライのコードのことなら、どのように動作するのかご教示ください。

 
すべてにおいて、このテーマはクローズドにすることができます。このコードが役に立つと思う人がいればうれしいです。そうでなければ、ダメなんだ...。
 
Реter Konow:

ちなみに、写真から判断すると、ここでの色分解は完全ではありません。半分だけ。白一色から黒一色まで、そして特定の色のすべての色調を網羅する必要があります。

はい、その通りです。

私はそれを実装し、あなたのコードを分析し、可視化することを試みました。

その中で出てきたのがこちら。

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

union rgb {uint clr; uchar c[4];};
void OnStart()
  {
   rgb c,cc;
   double d=5;
   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;
      uint CLR[];
      ulong t=GetMicrosecondCount();
      Gradient(c.clr,CLR,W.Height);
      t=GetMicrosecondCount()-t;
      for(int y=0; y<W.Height; y++)
        {
         Canvas.LineHorizontal(0,W.Width-1,y,ColorToARGB(CLR[y],240));
         c.clr=CLR[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(W.Width/2-80,W.Height/2-50,W.Width/2+80,W.Height/2+50,ColorToARGB(cc.clr,240));
      Canvas.CurentFont("Tahoma",20,22,ColorToARGB(~cc.clr)); // 20 -  размер шрифта, 22 - межстрочный интервал
      Canvas.TextPosition(W.Width/2-70,W.Height/2-40); // Стартовая позиция для шрифта в пикселях
      Canvas.Comm("Текущий цвет:");
      Canvas.Comm("R = "+string(cc.c[2]));
      Canvas.Comm("G = "+string(cc.c[1]));
      Canvas.Comm("B = "+string(cc.c[0]));
      Canvas.CurentFont("Times New Roman",30);
      Canvas.TextPosition(25.0,10.0);  // Стартовая позиция для шрифта в процентах от размеров экрана
      Canvas.Comm("Время формирования градиентного массива из "+string(W.Height)+" элементов = "+string(t)+" микросекунд");
      ChartChanged(); // на всякий случай контролируем изменение размеров окна, т.к. это скрипт (в индикаторах и экспертах это происходит автоматически)
      Canvas.Update();
      d+=0.01;
      Sleep(30);
     }
  }
//+------------------------------------------------------------------+

void Gradient(uint clr,uint &arr[],uint size)
  {
   if(size==0) return;
   ArrayResize(arr,size);
   rgb c;
   c.clr=clr;
   uchar R=c.c[2],G=c.c[1],B=c.c[0];
   uint i=0, tone=uint((size-1)*(((double)R+(double)G+(double)B)/765.0)+0.4999);
   double kR,kG,kB;
   if(tone!=0)
     {
      kR=(double)R/tone;
      kG=(double)G/tone;
      kB=(double)B/tone;
      for(i=0;i<=tone;i++)
        {
         c.c[2]=uchar(i*kR+0.4999);
         c.c[1]=uchar(i*kG+0.4999);
         c.c[0]=uchar(i*kB+0.4999);
         arr[i]=c.clr;
        }
     }
   if(tone!=(size-1))
     {
      kR=(double)(255-R)/(size-i);
      kG=(double)(255-G)/(size-i);
      kB=(double)(255-B)/(size-i);
      for(uint j=1;i<size;i++,j++)
        {
         c.c[2]=uchar(R+j*kR+0.4999);
         c.c[1]=uchar(G+j*kG+0.4999);
         c.c[0]=uchar(B+j*kB+0.4999);
         arr[i]=c.clr;
        }
     }
  }

あなたのバリアント


私のバリエーションです。


説明しよう。

白い線はトーンライン(R+B+Gの色の合計)で、まっすぐな対角線であることが理想的です。私は実装しているが、あなたは実装していない。

赤、青、緑の線は、色の比率を表す線です。スペクトルの高調波とでも言おうか。 垂直であることが理想だ。しかし、初期の最大色が255になってからは、実現不可能です。しかし、変曲点(赤い矢印で示した部分)がなく、滑らかな円弧を描くことができる状況に到達することができる。そうすると、グラデーションが「かたまり」なく見えるようになります。この問題は、あなたのアルゴリズムにも私のアルゴリズムにも存在します。 直すことは可能ですが、まだその意味がわからないので、時間の無駄です。実際には、ある色から別の色へのグラデーションが必要です。これは、スペクトルの厳密な垂直倍音で簡単に実装できます(上部の倍音がぼやけるのは丸めの結果であり、正常です)。しかし、この問題では、黒から白へのグラデーションが3色目を通過してしまうため、このようなねじれが生じてしまうのです。

不思議ですね、てっきりMQL5で書いているのかと思いました。 でも、4のプログラムそのもの以外に、4のプログラムスタイルもあるんですね。あなたのアルゴリズムを5に転送しようとしましたが、一部のカラーストライプしか表示されないため、うまくいきませんでした。これは、変数のスコープが混乱しているために起こる可能性が高いのですが、コードがデバッグに適していないために修正することは非常に困難で、あきらめました。あなたが自分のプログラミングスタイルに慣れていて、私のスタイルを理解していないことは理解しています。本のように読むのではなく、プログラムの構造を見るのに慣れているからこそ、お互いにね。そして、あなたのコードでは、デバッグや変数定義のどの瞬間かを理解することは不可能です。長い変数名がプログラムテキストの90%を占め、その結果、プログラムの構造は、この長いバービー色の変数名に溶けて失われていきます。全体として、あなたのコードは、個人的にはある種のSMのように見えます。

さらに、あなたのアルゴリズムは何十倍も遅いことが判明し、その理由は MQL4どころではありません 。私はそれを理解することができませんでした。 RGBしか ないのに、どんな接線、どんな三角形が あるのか?

そして ユニオン マスターしてみて ください。とても便利なもの です。

私が言っていることをよりよく理解するために、私が添付した両方のスクリプトを、あなたのアルゴリズム(MQL4)と私のアルゴリズム(MQL5)で実行してみてください。


そんな災難もあるんですね。

MT4が遅いのか、アルゴリズムに問題があるのか、まだよくわかりません。

ファイル:
 
Nikolai Semko:


1.ニコライ 最初に引用した2枚の写真を見比べても、あなたのバージョンには灰色の靄がかかっていることがすぐにわかるでしょう。よく見てください。そして、私のバージョンでは、色がより鮮やかになっています。あなたのバージョンの方が、色がよく伝わると思いますか?

2.Windowsのカラーパレットを参考にしました。99%の色合わせができた。Windowsと色が合っているか確認する。私のように色調を揃えてプリントアウトする。次に、チャートのプロパティと パレットを開いてください。初期色の成分値をウィンドウで入力し、スライダーを上下に動かしてください。数字が変わってくる。この数字をプリントアウトして、どの程度一致しているかを見るのです。

3.具体的な実施内容が異なることを理解しています。スピードに特化したアルゴリズムのチェックはしていませんし、スピードのための最適化も行っていません。あなたの解決策は、より高い速度を与えるように見えるかもしれません。否定はしない。

4.光学の世界にプリズムという概念があります。光の屈折という考え方があります。まさにこのパラダイムからのスタートだったのです。256*256(0から255まで)をプロットしてみました。そして、線をプロットしてみました。色の屈折の軸を見つけた。グラフの中央にあります。各コンポーネントは2つのセグメントからなるカーブである。この色は全部で3本の曲線があり、それぞれがグラフィックの中心で屈折して2分割されています。各セグメントには、それぞれの角度があります。元の色にはグラフ上の座標があります。その色合いの中に見つけることができます。私の仕事は、最初の色を見つけ、6つのセグメントすべての角度を決定し、その線に沿って各成分の値を取得することでした。

5.タンジェントとは、隣接するカセットの対向するカセットの比のことです。セグメントの角度の計算や、対向するカセットの高さ(具体的な色調における成分の値)を計算するために必要である。

6.プログラミングのスタイルについては、議論しないほうがいいと思います。話題の本質には関係ない。

7.誤操作について - もしかしたらそうかもしれません。でも、まだ出会っていないんです。だから、わからないのです。


ところで、あなたのバージョンでは、色分解がどのように機能するのか教えてください。完全に理解できているわけではありません。

Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Графики в торговой платформе отображают изменение котировок финансовых инструментов во времени. Они необходимы для проведения технического анализа и работы советников. Они позволяют трейдерам наглядно следить за котировками валют и акций в режиме реального времени и моментально реагировать на любое изменение ситуации на финансовых рынках...
 
Nikolai Semko:


ただ、MT4の動作が重いのか、アルゴリズムのバグなのか、まだよく分かっていません。

アルゴリズムの速度の違いについて。

1.あなたのアルゴリズムは整数 配列に、私のアルゴリズムは文字列 配列に充填します。(シェードから必要なコンポーネントを簡単に取り出して作業するために、まさに文字列が必要なのです)。以下のスクリプトから、両タイプの配列への充填速度の違いを確認することができます。

2.あなたのアルゴリズムはМТ5で、私のアルゴリズムはМТ4で動作する。これらのプラットフォームにおけるアレイの充填速度の違いについては、私がここで説明しました -https://www.mql5.com/ru/forum/222333. 以下のスクリプトから、その違いをご自身でご確認ください。両プラットフォームに載せて比較する。

//+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int int_Array[30000];
string string_Array[30000];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < 30000; b1++)int_Array[b1] = 1;
   //--------------------------
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   int q = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print("//----------------------------------------------------------------------------------");
   Print(" Время заполнения массива      int:  ",t2-t1);
   
 
 
   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b2 = 0; b2 < 30000; b2++)string_Array[b2] = "1";
   //--------------------------
   ulong t4 = GetMicrosecondCount();
   //--------------------------
   int q2 = int_Array[0] + int_Array[1];//Этот код нужен, иначе компилятор не заполняет массив.
   //--------------------------
   Print(" Время заполнения массива string:  ",t4-t3);   
   Print("//----------------------------------------------------------------------------------");
   
   Alert(q + q2);//Этот код нужен, иначе компилятор не заполняет массив.
  }
//+------------------------------------------------------------------+

MT4とMT5でint配列とstring配列の3万セルの速度を測定してみました(ms)。

MT5
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива string:  464
2018.10.11 13:29:24.502 Замер скорости заполнения массивов (RTS-12.18,H1)  Время заполнения массива    int:  14

MT4
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива string:  692
2018.10.11 13:30:39.199 Замер скорости заполнения массивов GBPUSD,M30:     Время заполнения массива    int:  363

ご覧の通り、私のアルゴリズムの方が遅い理由は2つあります。

  1. 文字列配列を埋めて、uint配列は埋めません。
  2. MT4でしかテストしていないのですね。プラットフォーム間でアレイの充填速度が何十倍も違うことがあります。
P.S. さらに、私のアルゴリズムは、元の色がある配列のセルの数を返すことができます。グラデーションを作るのに役立ちます。何しろ、どのセルから左右に移動するかを知る必要があるのですから。
MT5 vs MT4. Скорость заполнения массивов.
MT5 vs MT4. Скорость заполнения массивов.
  • 2017.12.12
  • www.mql5.com
Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5...
 
Реter Konow:

アルゴリズムの速度の違いについて。

1. あなたのアルゴリズムは整数 配列に、私のアルゴリズムは文字列 配列に入力します。(シェードから必要な成分を簡単に取り出して作業できる文字列が必要です)。以下のスクリプトから、両タイプの配列への充填速度の違いを確認することができます。

2.あなたのアルゴリズムはМТ5で、私のアルゴリズムはМТ4で動作する。これらのプラットフォームにおけるアレイの充填速度の違いについては、私がここで説明しました -https://www.mql5.com/ru/forum/222333. 以下のスクリプトから、その違いをご自身でご確認ください。両プラットフォームに載せて比較する。

MT4とMT5でint配列とstring配列の3万セルの速度を測定してみました(ms)。

ご覧の通り、私のアルゴリズムの方が遅い理由は2つあります。

  1. 文字列配列を埋めて、uint配列は埋めません。
  2. MT4でしかテストしていないのですね。プラットフォーム間でアレイの充填速度が何十倍も違うことがあります。
P.S. さらに、私のアルゴリズムは、元の色がある配列のセルの数を返すことができます。グラデーションを作るのに役立ちます。何しろ、どのセルから左右に移動するかを知る必要があるのですから。
アルゴリズムからTバックを取り出した。なぜ使ったのか、謎でしたね。コードを見てください、ではどうやって本当の色を出力するのでしょう。 余計なチェックが多く、タンジェントや配列ソートなどの関数を使っていますが、私は+-*//しか使っていません。Mt4が遅いのは理解できるけど、30倍はないでしょう。
よし、後で4にアルゴリズムを載せて見てみよう。なんで4まで使ってるんだ?GUIとしては4は全然ダメだな。リソースも読まない。4から5にかけては、コードの変換が大変なんです。