표시선에 볼륨 효과 추가 - 페이지 4

 
barabashkakvn :
스무딩 없이 포인트를 그렸습니다. 결국 저는 특히 PixelSetAA 방법을 선택했습니다. 앤티 앨리어싱으로 점을 그리는 것입니다.

PixelSetAA 를 사용하여 선을 그려보십시오.

PolylineAA 방법은 LineAA 방법을 사용합니다. LineAA 방법은 PixelSetAA 방법을 사용합니다. 한 점을 그리면 매끄럽게 하는 효과가 나타나지 않습니다.

 
tol64 :
PixelSetAA 를 사용하여 선을 그려보십시오.

아니요. 효과가 없습니다. 스무딩 포인트 근처에는 없습니다. 날카로운 모서리는 벽돌과 같습니다.

PixelSetAA를 통한 점선

 
barabashkakvn :

아니요. 효과가 없습니다. 스무딩 포인트 근처에는 없습니다. 날카로운 모서리는 벽돌과 같습니다.  

이전 게시물을 업데이트했습니다. 이러한 방법이 구현되는 방식에 주의하고 앤티앨리어싱이 필요한 경우 사용합니다.
 
tol64 :
이전 게시물을 업데이트했습니다. 이러한 방법이 구현되는 방식에 주의하고 앤티앨리어싱이 필요한 경우 사용합니다.
저는 아직 앤티앨리어싱된 선 그리기 방법인 PolylineAA 를 건드리지 않았습니다. PixelSetAA 도움말에 명시된 내용을 알고 싶습니다.
PixelSetAA - 앤티 앨리어싱 알고리즘을 사용하여 점을 그립니다.

이 방법은 앤티 앨리어싱으로 점을 그리기 때문에 여러 점을 연속으로 그리면 다음 그림과 같은 결과를 얻을 수 있습니다.

앤티 앨리어싱으로 많은 점처럼 보여야한다고 생각합니다.

그러나 나는 도트 스무딩을 얻지 못합니다.

 
barabashkakvn :
저는 아직 앤티앨리어싱된 선 그리기 방법인 PolylineAA 를 건드리지 않았습니다. PixelSetAA 도움말에 명시된 내용을 알고 싶습니다.
PixelSetAA - 앤티 앨리어싱 알고리즘을 사용하여 점을 그립니다.

이 방법은 앤티 앨리어싱으로 점을 그리기 때문에 여러 점을 연속으로 그리면 다음 그림과 같은 결과를 얻을 수 있습니다.  

그러나 나는 도트 스무딩을 얻지 못합니다.

따라서 앤티앨리어싱이 있는 메서드 코드와 없는 메서드 코드를 비교할 것을 제안합니다. 코드는 공부할 수 있습니다.

이해하고 이해하려면 이러한 방법에 사용되는 알고리즘을 철저히 연구해야 합니다.

이 주제에 대한 기사를 작성할 수도 있습니다. 나는 기꺼이 그것을 읽을 것입니다. )

 
요점은 매끄럽게 할 수 없으며 어떤 의미에서는 "소립자"입니다)
 
komposter :
요점은 매끄럽게 할 수 없으며 어떤 의미에서는 "소립자"입니다)
그래서 질문은 다음과 같습니다. 두 가지 방법( PixelSetPixelSetAA )이 있습니다. PixelSetAA 에 매우 관심이 있습니다. 도트 스무딩이 어떻게 작동하는지 이해하지 못할 수도 있습니다.
 
barabashkakvn :
그래서 질문은 다음과 같습니다. 두 가지 방법( PixelSetPixelSetAA )이 있습니다. PixelSetAA 에 매우 관심이 있습니다. 도트 스무딩이 어떻게 작동하는지 이해하지 못할 수도 있습니다.

아무 것도 도움이되지 않으면 도움말을 읽으십시오 ;)

PixelSet은 단순히 점의 색상을 설정합니다.

 
우리는 도움말을 읽고 있습니다. 그래서 질문은 " PixelSetAA 가 앤티 앨리어싱을 사용하여 단일 점이라도 그려야 합니까?"입니다. 의견을 듣고 싶습니다.
 
barabashkakvn :
우리는 도움말을 읽고 있습니다. 그래서 질문은 " PixelSetAA 가 앤티 앨리어싱을 사용하여 단일 점이라도 그려야 합니까?"입니다. 의견을 듣고 싶습니다.

일반적으로 대답은 다음과 같습니다. PixelSetAA 방법 앤티 앨리어싱을 사용하여 단일 점이라도 그려야 하며 이 방법은 여전히 앤티 앨리어싱을 사용하여 이 단일 점을 그립니다 . 이렇게 하려면 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));
     }
  }

스무딩은 이중 유형 숫자를 좌표로 전달하는 경우에만 나타납니다. 또한 반올림된 값이 아니라 "꼬리"가 있는 경우에만 나타납니다. 200.4와 같은 것; 125.6; 200.7

다음은 PixelSetAA 방법을 사용하여 점으로 그린 포물선이며 여전히 앤티 앨리어싱으로 그리기 시작했습니다.

PixelSetAA 메서드를 통해 점으로 그린 포물선이며 여전히 앤티 앨리어싱으로 그리기 시작했습니다.

사유: