정보

자연스러운 펜툴 만들기 – 2

지난번에 Polygon과 Ellipse를 이용하여 자연스러운 펜툴을 만드는 방법을 연구해봤는데, 그림 그리는 도구에서 브러시에 알파값을 먹이는 경우가 잦기 때문에 시도해봤더니 겹쳐서 그리다보니 전부 보이더군요.

비툴, 사이툴, 오에카키 등은 위의 방법과 다른 방법을 사용한다는 점을 하루종일 연구하면서 알게 되었습니다(사실 도저히 모르겠어서 리버스 엔지니어링도 시도해봤는데 눈에띄는 코드가 없어서 포기하고 픽셀 움직임을 중점으로 봤습니다 ㅠㅠ). 특히 비툴이 눈에 잘 띄더군요. 그 방법이랄게, 선을 그리는 알고리즘을 개량하면 되는 겁니다.

선을 그리는 알고리즘은 직선의 방정식 이용, DDA 알고리즘, 브래슨햄 알고리즘 등 매우 다양합니다. 이 중에서 저는 딱히 구현하기 귀찮아서 그냥 64비트 멀티코어 OS 원리와 구조 2권에 나오는 선 그리기 함수를 조금 개량해서 그리기에 시도해봤습니다. 자세한 알고리즘은 선그리기 알고리즘( http://setimets.blog.me/30068320547 ) 이곳을 참고해보시기 바랍니다. 액션스크립트 예제 중심이지만 다른 언어로 쉽게 옮길 수 있을겁니다.

아래는 그 소스 코드의 일부입니다.

private void DrawLine ( Graphics g, PointF p, PointF p2 )
{
    int iDeltaX, iDeltaY;
    int iError = 0;
    int iDeltaError;
    int iX, iY;
    int iStepX, iStepY;
 
    iDeltaX = (int)(p2.X - p.X);
    iDeltaY = (int)(p2.Y - p.Y);
 
    if ( iDeltaX < 0 )
    {
        iDeltaX = -iDeltaX;
        iStepX = -1;
    }
    else iStepX = 1;
 
    if ( iDeltaY < 0 )
    {
        iDeltaY = -iDeltaY;
        iStepY = -1;
    }
    else iStepY = 1;

    if ( iDeltaX > iDeltaY )
    {
        iDeltaError = ( ( int ) iDeltaY ) << 1;
        iY = (int)p.Y;
        for ( iX = ( int ) p.X; iX != p2.X; iX += iStepX )
        {
            DrawPoint ( g, new PointF ( iX, iY ) );

            iError += iDeltaError;

            if ( iError >= iDeltaX )
            {
                iY += iStepY;
                iError -= ( ( int ) iDeltaX ) << 1;
            }
        }
        DrawPoint ( g, new PointF ( iX, iY ) );
    }
    else
    {
        iDeltaError = ( ( int ) iDeltaX ) << 1;
        iX = ( int ) p.X;
        for ( iY = ( int ) p.Y; iY != p2.Y; iY += iStepY )
        {
            DrawPoint ( g, new PointF ( iX, iY ) );

            iError += iDeltaError;

            if ( iError >= iDeltaY )
            {
                iX += iStepX;
                iError -= ( ( int ) iDeltaY ) << 1;
            }
        }
        DrawPoint ( g, new PointF ( iX, iY ) );
    }
}

결과는 성공적이었습니다. 거의 비슷하게 구현이 되었습니다.

e20f0581f32b78f829e05a1b685f2ae7

광고

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.