キャンバスがカッコいい! - ページ 47

 
Maxim Kuznetsov:

平面上の円ではなく、3次元の円柱 :-)コースはスパイラルで出てきます。円筒座標をうまくマークアップすれば、かなりセンス良く

可能性がある。
 
Maxim Kuznetsov:

そうすると、平面上の円ではなく、3次元の円柱になります :-)コースはスパイラルで出てきます。円筒座標をうまくマークアップすれば、かなりセンス良く

実は、導入はそれほど難しいことではありません。追加で2~5行のコード。誰もやっていないのであれば、暇なときにでもやってみよう。

でも、4Kの画面はあったほうがいいんです

 
Maxim Kuznetsov:

となると、平面上の円ではなく、3次元の円柱になります :-)コースはスパイラルで出てきます。円筒座標をうまくマークアップすれば、かなりセンス良く

https://www.mql5.com/en/code/27662

コードのスピードとサイズにご注目ください。
しかも、Direct Xなしで

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

コードのスピードとサイズにご注目ください。
しかも、Direct Xなしで

マジカル!

半径は何に依存するのでしょうか?

リングを多色化するのは難しいですか?

この可視化は、最適化における最適な50パスや、コンパクションにおける最適化全体を評価するのに役立つと思われます。

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

スピードとコードの大きさにご注目ください。
しかも、Direct Xなしで

単純に、マジック。!!!

さらに、軸に極座標を加え、ほぼ直線の「平行線」 (と平行な「子午線」)までスケールを変更できるようにすれば、従来のグラフィックスにスムーズに移行することができます。

 
Nikolai Semko:

https://www.mql5.com/en/code/27662

コードのスピードとサイズにご注目ください。
しかも、Direct Xなしで

+++
 

皆さん、ありがとうございました。


Aleksey Vyazmikin:

魔法のようです。

半径は何に依存するのでしょうか?

リングを多色化するのは難しいですか?

この可視化は、最適化中の最適な50パスや、コンパクション中の最適化全体を評価するのに役立つと思われます。

この3Dグラフィックスと回転制御のコードは、すべてこの関数に収まっています。

void Draw(double &c[]) {
   double _r=_Height/2-7;
   int Per=int(2*M_PI*_r);
   int X=_Width/2;
   int Y=_Height/2-5;
   double K=10*_Height;
   Canvas.Erase(0xFF000000);
   int Size =ArraySize(c);
   double max = c[ArrayMaximum(c,0)];
   double min = c[ArrayMinimum(c,0)];
   if (max-min<=0) return;
   double _a=2*M_PI/per*(_Width/2  - _MouseX + 5*per); // угол камеры по горизонтали (_MouseX  - текущая координата X указателя мышки)
   double _b=2*M_PI/per*(_Height/2 - _MouseY + 5*per); // угол камеры по вертикали   (_MouseY  - текущая координата Y указателя мышки)
   for (int i=0; i<Size; i++) {
      double r = _r*(0.3+0.7*(c[i]-min)/(max-min));
      double a = 2*M_PI/per*i;
      double z =r -r*2*double(i)/Size;
      double x = cos(a)*r;
      double y = sin(a)*r;
      double R=sqrt(x*x+y*y+z*z);
      double x1=x*cos(_a)+z*sin(_a);
      double z1=-x*sin(_a)+z*cos(_a);
      double y1=y*cos(_b)+z1*sin(_b);
      double z2=-y*sin(_b)+z1*cos(_b);
      z2=z2+_r;
      x=X+K*x1/(z2+K);
      y=Y+K*y1/(z2+K);
      _PixelSet((int)x,(int)y,Grad(double(i)/Size));
   }
   Canvas.Update();
}

この関数への入力は価格の配列のみである。小学生でもわかる暗号1次元の価格配列を3次元の点配列に変換する。XY平面では極座標系で表され、中心(0,0)からの距離r=sqrt(x2+y2)が価格となる。

色の選定はこの機能の責任です。

uint Grad(double p) {
   static uint Col[6]= {0xFF0000FF,0xFFFF00FF,0xFFFF0000,0xFFFFFF00,0xFF00FF00,0xFF00FFFF};
   if(p>0.9999) return Col[5];
   if(p<0.0001) return Col[0];
   p=p*5;
   int n=(int)p;
   double k=p-n;
   argb c1,c2;
   c1.clr=Col[n];
   c2.clr=Col[n+1];
   return ARGB(255,c1.c[2]+uchar(k*(c2.c[2]-c1.c[2])+0.5),
               c1.c[1]+uchar(k*(c2.c[1]-c1.c[1])+0.5),
               c1.c[0]+uchar(k*(c2.c[0]-c1.c[0])+0.5));
}

入力 p は 0 から 1 までの数で、出力は選択されたグラデーションの色である。この場合のカラーパターンの骨格自体は、6色(配列Col)で構成されている

どのような方法で、どのように着色するのも自由です

 
Aleksey Panfilov:

単純に、マジック。!!!

さらに、軸に極座標を加え、ほぼ直線の「平行線」 (と平行な「子午線」)まで、スケールを変えることができれば、従来のグラフにスムーズに移行することができます。

確かに、でも、スケールの違いでコードを乱雑にしたくないんです。今回は、余計なものが入っていないコードを見せることが重要でした。そうすれば、より理解しやすくなるはずです。

 
Nikolai Semko:

確かに、でも、スケールの違いでコードを乱雑にしたくないんです。今回は、余計なものを排除してコードを見せることが重要でした。その方がわかりやすいと思います。

ニコライさん、ライブラリについて質問なのですが、エキスパートアドバイザーにデータを取り込む方法は?

 
Martingeil:

ニコライさん、ライブラリについて質問なのですが、エキスパートアドバイザーにデータを取り込む方法は?

質問がよくわからないのですが、iCanvasはグラフィックライブラリです。
iCanvasでライン表示のインジケータを作成し、バッファレスにした場合、EAにどのようにデータを読み込むかという質問でしょう。それなら、もっとわかりやすく表現してください。

まず、標準的なインジケータのようにバッファインジケータ配列を作成することは誰も禁じていませんが、単にINDICATOR_CALCULATIONSにし、通常の方法でiCustomを通してデータにアクセスするようにしましょう。

第二に、リソースという強力なツールがあることです。インジケーターバッファは 基本的に同じリソースです。いずれにせよ、データの保存とアクセスの仕組みは同じです。

資源を扱う。地味ですが、データの受け渡しに重要なツールなんです。古典的なバッファ配列よりも効率的な独自のライブラリを作成することができます。

個人的には、公表していない自分のデザインを使っています。iCustomのアクセスより便利で効率的です。全てはリソースを通して正確に実装されています。

理由: