インジケーターラインにボリューム効果を付加する - ページ 4

 
barabashkakvn:
ドットはアンチエイリアスをかけずに描画されます。具体的には、アンチエイリアスをかけてドットを描く「PixelSetAA」 方式を選択しました。

PixelSetAAで 線を引いてみてください。

PolylineAA メソッドはLineAA メソッドを使用します。LineAA メソッドは、PixelSetAA メソッドを使用しています。一点描画することで、アンチエイリアスの効果を実感することができません。

 
tol64:
PixelSetAAで 線を引いてみてください。

いや、効果なし。スムージングの近点がない。鋭い角はレンガのようなもの。

ドットのある線 via PixelSetAA

 
barabashkakvn:

いや、効果なし。スムージングの近点がない。鋭い角はレンガのようなもの。

前回の投稿を補足しました。上記の方法がどのように実装されているかに注目し、平滑化が必要な場合に使用する。
 
tol64:
前回のメッセージに補足をさせていただきました。上記の方法がどのように実装されているかに注目し、スムージングが必要な場合に使用します。
スムージングを使った線画法-PolylineAAは 今のところ触っていません。PixelSetAAについて ヘルプに記載されていることを理解したいです。
PixelSetAA-アンチエイリアシングアルゴリズムを使用して点を描画 する.

このメソッドはアンチエイリアスをかけて点を描画するので、いくつかの点を連続して描画すると、このような画像になるはずです。

スムージングを施した多くのドットは、このように見えるはずです。

でも、スムーズなポイントがつかめないんです。

 
barabashkakvn:
スムージングで線を引く方法-PolylineAAは 今のところ触っていません。PixelSetAAについて、ヘルプに記載されている内容を理解したい。
PixelSetAA-アンチエイリアシングアルゴリズムを使用して点を描画 する.

このメソッドはアンチエイリアスをかけて点を描画するので、いくつかの点を連続して描画すると、このような画像になるはずです

でも、スムーズなポイントがつかめないんです。

ですから、アンチエイリアスをかけた方法とかけない方法のコードを比較することをお勧めします。このコードは研究用に公開されています。

それを理解するためには、これらの手法に使われているアルゴリズムを徹底的に勉強する必要があります。

このテーマで記事を書いてもいいくらいです。自分でも読んでみたいと思います。)

 
ドットは平滑化できない、ある意味「素粒子」である )
 
komposter:
ドットは平滑化できない、ある意味「素粒子」なのです )
そこで質問なのですが、2つのメソッド(PixelSetとPixelSetAA)があります。PixelSetAAに とても興味があるのですが、もしかしてドットスムージングの仕組みがわかっていないのでしょうか?
 
barabashkakvn:
そこで質問なのですが、2つの方法(PixelSetとPixelSetAA)があります。PixelSetAAに 非常に興味があるのですが、ドットスムージングの仕組みがよくわからないのかも?

他のすべてが失敗した場合、ヘルプを読んでください ;)

PixelSetは単に点の色を設定するだけです。

 
ヘルプを読みました。で、「PixelSetAAは 1点でもアンチエイリアスを使った描画をすべきか?意見を聞きたい。
 
barabashkakvn:
ヘルプを読みました。で、「PixelSetAAは 1点でもアンチエイリアスを使った描画をすべきか?意見を聞きたい。

答えは、PixelSetAA メソッドは1点でもアンチエイリアスを使用して描画する必要が あり、その1点をアンチエイリアスを使用して描画して います。そのために、CCanvasのコードを調べる必要がありました。

//+------------------------------------------------------------------+
//| Draw pixel with antialiasing                                     |
//+------------------------------------------------------------------+
void CCanvas::PixelSetAA(const double x,const double y,const uint clr)
  {
   static double rr[4];
   static int    xx[4];
   static int    yy[4];
//--- preliminary calculations
   int    ix=(int)MathRound(x);
   int    iy=(int)MathRound(y);
   double rrr=0;
   double k;
   double dx=x-ix;
   double dy=y-iy;
   uchar  a,r,g,b;
   uint   c;
//--- no need for anti-aliasing
   if(dx==0.0 && dy==0.0)
     {
      PixelSet(ix,iy,clr);
      return;
     }
//--- prepare array of pixels
   xx[0]=xx[2]=ix;
   yy[0]=yy[1]=iy;
   if(dx<0.0)
      xx[1]=xx[3]=ix-1;
   if(dx==0.0)
      xx[1]=xx[3]=ix;
   if(dx>0.0)
      xx[1]=xx[3]=ix+1;
   if(dy<0.0)
      yy[2]=yy[2]=iy-1;
   if(dy==0.0)
      yy[2]=yy[2]=iy;
   if(dy>0.0)
      yy[2]=yy[2]=iy+1;
//--- calculate radii and sum of their squares
   for(int i=0;i<4;i++)
     {
      dx=xx[i]-x;
      dy=yy[i]-y;
      rr[i]=1/(dx*dx+dy*dy);
      rrr+=rr[i];
     }
//--- draw pixels
   for(int i=0;i<4;i++)
     {
      k=rr[i]/rrr;
      c=PixelGet(xx[i],yy[i]);
      a=(uchar)(k*GETRGBA(clr)+(1-k)*GETRGBA(c));
      r=(uchar)(k*GETRGBR(clr)+(1-k)*GETRGBR(c));
      g=(uchar)(k*GETRGBG(clr)+(1-k)*GETRGBG(c));
      b=(uchar)(k*GETRGBB(clr)+(1-k)*GETRGBB(c));
      PixelSet(xx[i],yy[i],ARGB(a,r,g,b));
     }
  }

クラスで、座標として double 型の数値を渡した場合にのみスムージングが現れ、丸められた値ではなく、「尾」がついていることに気がつきました。200.4、125.6、200.7といったところでしょうか。

PixelSetAA メソッドを使ってポイントで描いた放物線ですが、アンチエイリアスがかかった状態で描画が開始されます。

PixelSetAAメソッドでドットで描いた放物線は、スムージングで描かれるようになったが

ファイル:
理由: