Gösterge Çizgilerine Hacim Etkisi Ekleme - sayfa 4

 
barabashkakvn :
Noktalar yumuşatılmadan çizilmiştir. Sonuçta, özellikle PixelSetAA yöntemini seçtim - kenar yumuşatma ile bir nokta çizdim.

PixelSetAA kullanarak bir çizgi çizmeyi deneyin.

PolylineAA yöntemi, LineAA yöntemini kullanır. LineAA yöntemi, PixelSetAA yöntemini kullanır. Tek bir nokta çizerek yumuşatma etkisini görmezsiniz.

 
tol64 :
PixelSetAA kullanarak bir çizgi çizmeyi deneyin.

Hayır. Etkisi yok. Düzeltme noktalarının yakınında yok. Keskin köşeler tuğla gibidir:

PixelSetAA aracılığıyla Noktalı Çizgi

 
barabashkakvn :

Hayır. Etkisi yok. Düzeltme noktalarının yakınında yok. Keskin köşeler tuğla gibidir:  

Bir önceki gönderiyi güncelledim. Bu yöntemlerin nasıl uygulandığına dikkat edin ve yumuşatmaya ihtiyacınız varsa bunları kullanın.
 
tol64 :
Bir önceki gönderiyi güncelledim. Bu yöntemlerin nasıl uygulandığına dikkat edin ve yumuşatmaya ihtiyacınız varsa bunları kullanın.
Kenar yumuşatılmış çizgi çizme yöntemine henüz dokunmadım - PolylineAA . PixelSetAA ile ilgili yardımda belirtilenleri anlamak istiyorum:
PixelSetAA - Bir kenar yumuşatma algoritması kullanarak bir nokta çizer.

Bu yöntem kenar yumuşatma ile bir nokta çizdiğinden, art arda birkaç nokta çizersem bu resimdeki gibi bir şey elde etmeliyim:

Kenar yumuşatma ile bir çok nokta gibi görünmesi gerektiğini düşünüyorum

Ama nokta yumuşatma almıyorum.

 
barabashkakvn :
Kenar yumuşatılmış çizgi çizme yöntemine henüz dokunmadım - PolylineAA . PixelSetAA ile ilgili yardımda belirtilenleri anlamak istiyorum:
PixelSetAA - Bir kenar yumuşatma algoritması kullanarak bir nokta çizer.

Bu yöntem kenar yumuşatma ile bir nokta çizdiğinden, art arda birkaç nokta çizersem bu resimdeki gibi bir şey elde etmeliyim:  

Ama nokta yumuşatma almıyorum.

Bu nedenle, yöntem kodunu kenar yumuşatma ve onsuz benzeri olanlarla karşılaştırmayı öneriyorum. Kod çalışmaya açıktır.

Anlamak ve anlamak için bu yöntemlerde kullanılan algoritmaları iyice incelemeniz gerekir.

Hatta bu konu hakkında bir makale bile yazabilirsiniz. Kendim seve seve okurdum. )

 
Nokta yumuşatılamaz, bir anlamda "temel parçacık")
 
komposter :
Nokta yumuşatılamaz, bir anlamda "temel parçacık")
İşte bu yüzden soru şu: iki yöntem var ( PixelSet ve PixelSetAA ). PixelSetAA ile çok ilgileniyorum - belki nokta yumuşatmanın nasıl çalıştığını anlamıyorum?
 
barabashkakvn :
İşte bu yüzden soru şu: iki yöntem var ( PixelSet ve PixelSetAA ). PixelSetAA ile çok ilgileniyorum - belki nokta yumuşatmanın nasıl çalıştığını anlamıyorum?

Hiçbir şey yardımcı olmazsa, yardımı okuyun;)

PixelSet, noktanın rengini ayarlar.

 
Yardımı okuyoruz. Ve böylece soru şudur: " PixelSetAA kenar yumuşatma kullanarak tek bir nokta bile çizmeli mi?". Bir fikir duymak istiyorum.
 
barabashkakvn :
Yardımı okuyoruz. Ve böylece soru şudur: " PixelSetAA kenar yumuşatma kullanarak tek bir nokta bile çizmeli mi?". Bir fikir duymak istiyorum.

Genel olarak cevap şudur: PixelSetAA yöntemi , kenar yumuşatma kullanarak tek bir nokta bile çizmelidir ve bu yöntem hala kenar yumuşatma kullanarak bu tek noktayı çizer . Bunu yapmak için CCanvas sınıfının koduna bakmam gerekti:

 //+------------------------------------------------------------------+
//| 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));
     }
  }

ve düzgünleştirmenin yalnızca koordinat olarak çift tip bir sayı iletirseniz göründüğünü anlayın, ayrıca yuvarlatılmış bir değer değil, bir "kuyruk" ile. 200.4 gibi bir şey; 125.6; 200.7

İşte PixelSetAA yöntemi kullanılarak noktalarla çizilen bir parabol ve hala kenar yumuşatma ile çizilmeye başlandı:

PixelSetAA yöntemiyle noktalarla çizilen ve hala kenar yumuşatma ile çizilmeye başlayan bir parabol

Dosyalar:
Neden: