Contents

Develop
2013.04.23 14:51

[c] 윈도우 API sin 함수 출력..

조회 수 15664 댓글 0
Atachment
첨부 '1'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
coord.jpg

void Draw( HDC hdc )
{
    int ommd;
    int x, y, xres, yres;
    HBRUSH hobr;
    HPEN hopen;

    ommd = SetMapMode( hdc, MM_ANISOTROPIC );

    // 가로 5눈금, 세로 6 눈금(unit)으로 구성되는 사각영역에 그림 그리기
    SetWindowExtEx( hdc, 5, -6, 0 );

    //위의 가로 5, 세로 6의 논리 눈금에 대한 디바이스(픽셀)눈금수는
    //현재 디바이스에 적용되고 있는
    //가로 길이 해상도(resolution)의 80%
    //세로 길이 해상도(resolution)의 80%을 그리기 영역으로 사용한다고 가정
    xres = GetDeviceCaps( hdc, HORZRES ) * 0.8;
    yres = GetDeviceCaps( hdc, VERTRES ) * 0.8;
    SetViewportExtEx( hdc, xres, yres, 0 );

    // 디바이스 눈금단위로 사각형의 좌측 하단부의 좌표를 viewport 원점으로 삼는다.
    // 대략 Xvo는 논리 1눈금의 디바이스 길이 절반 : xres / (5*2)
    // 대략 Yvo는 논리 6눈금의 디바이스 길이 보다약간 길게 : yres * 1.1;
    xres /=(5*2);
    yres *= 1.1;
    SetViewportOrgEx( hdc, xres, yres, 0 );

    // 아래에서는 논리 단위 눈금으로 그리기를 시행합니다.
    // 논리 1길이의 눈금은 너무 굵은 펜 ...
    // hopen = (HPEN)SelectObject( hdc, CreatePen( PS_SOLID, 1, RGB(0,0,0) ) );

    // x-축그리기사각형의 가로 길이(5 눈금)보다 길게
    MoveToEx( hdc, -1, 0, NULL );
    LineTo( hdc, 6, 0 );

    // y-축 그리기 사각형의 세로 길이(6 눈금)보다 길게
    MoveToEx( hdc, 0, 7, NULL );
    LineTo( hdc, 0, -1 );

    // 4 각 영역을 그립니다.
    hobr = ( HBRUSH )SelectObject( hdc, CreateSolidBrush( RGB( 255,255,220 )) );

    // MM_TEXT모드와 달리 y의 죄표들에 유념하여
    Rectangle( hdc, 0, 0, 5, 6 );

    // y-축의 눈금( 가로 눈금(unit)을 그리기 )
    for( y = 1; y <= 5; y++ )
    {
        MoveToEx( hdc, 0, y, NULL );
        LineTo( hdc, 5, y );
    }

    // x-축의 눈금( 세로 눈금(unit)을 그리기 )
    for( x = 1; x <= 4; x++ )
    {
        MoveToEx( hdc, x, 0, NULL );
        LineTo( hdc, x, 6 );
    }

    // 영역에서 직선 그리기
    MoveToEx( hdc, 1,1, NULL );
    LineTo( hdc, 4, 5 );

    // 영역에서 타원 그리기
    SelectObject( hdc, GetStockObject( NULL_BRUSH ) );
    Ellipse( hdc, 0,0, 5, 6 );

    // 맵핑모드를 복귀시킵니다.
    SetMapMode( hdc, ommd );
    DeleteObject( SelectObject( hdc, hobr ) );
    // DeleteObject( SelectObject( hdc, hopen ) );
}


1. 좀 더 필요한 정보를 얻고 싶다면 아래 사이트들을 참고 하면 도움이 될 것이다.

http://www.funducode.com/freevc/gdi/gdi5/gdi5.htm
http://wvware.sourceforge.net/caolan/mapmode.html

void Draw(HDC hdc)
{
    double f;
    int y;

    //MM_ANISOTROPIC은 x,y축 방향의 임의의 스케일을 가지는 임의의 크기의 눈금 
    //단위를 적용할 경우에사용할 수 있는 매핑모드입니다.
    // ( MM_ISOTROPIC은 x,y축 동일한 스케일의 임의의 크기의 눈금단위사용 )
    
    //여기서는 그리기의 스케일의 크기는 변화가 없지만 스케일의 방향이 변화가 
    //되었으므로 MM_ANISOTROPIC를 사용할 수 있습니다.
    int ommd = SetMapMode(hdc, MM_ANISOTROPIC);
    
    // 1. 님께서 처음 작성하신데로 viewport org을 옮깁니다.
    SetViewportOrgEx(hdc, 280, 250, NULL);

    // 2. scale를 변화시킵니다.( 여기서는 y-방향만 바꾸기 위하여 )
    //MM_ANISOTROPIC이나 MM_ISOTROPIC의 매핑모드를 사용할 때는
    //스케일을 적용할 수있도록 아래 두개의 함수를 호출합니다.
    //여기서 논리단위 1에 대하여 디바이스 단위 크기 1픽셀을 적용하였을 경우에 대하여 
    // 두 함수를 다음과 같이 호출합니다.
    // window의 x방향의 논리단위 1과 viewport의 x방향의 디바이스단위 1에 대응하고
    // window의 y방향의 논리단위 -1과 viewport의 y방향의 디바이스단위 1에 대응합니다.
    SetWindowExtEx( hdc, 1, -1, NULL);
    SetViewportExtEx( hdc, 1, 1, NULL);
    
    MoveToEx(hdc, -2000, 0, NULL); //X축 그림
    LineTo(hdc, 2000, 0);
    MoveToEx(hdc, 0, -2000, NULL); //y축 그림
    
    LineTo(hdc, 0, 2000);
    
    for (f=-500; f<1000; f++)
    {
        y = (int)(tan(f * PI / 180) * 100);
        SetPixel(hdc, int(f), y, RGB(255,0,0));
    }
    
    // 맵핑모드를 복귀시킵니다.
    SetMapMode( hdc, ommd );
}
///////////////////////////////////////////////////////////////////////////////
테스트해본 결과로는 주석해제해야 제대로 출력된다.
디폴트모드인 MM_TEXT는 y축값이 위쪽이 작고 아래쪽이 크므로 보통 수학에서 사용하는 좌표와는 반대이다.
SetMapMode(hdc, MM_LOENGLISH);를 해주어야 y축값이 위쪽이 크고 아래쪽이 작은 것이 된다.


#include<windows.h>
#include<math.h>

#define g_ClassName "GraphClass"
#defineg_Title"Graph"
HWND g_hwndMain;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpszArgs, int nCmdShow)
{
    MSG msg;
    WNDCLASS wc;
    wc.style=0;
    wc.lpfnWndProc=WndProc;
    wc.lpszClassName=g_ClassName;
    wc.lpszMenuName=NULL;
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hInstance=hInstance;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.cbClsExtra=0; 
    wc.cbWndExtra=0;
    if(!RegisterClass(&wc)) return FALSE;
    
    g_hwndMain=CreateWindow(g_ClassName,
        g_Title,
        WS_OVERLAPPEDWINDOW,
        0,0,600,600,
        NULL,
        NULL,
        hInstance,
        NULL
    );
    
    if(!g_hwndMain) return FALSE;
    
    ShowWindow(g_hwndMain,nCmdShow); 
    UpdateWindow(g_hwndMain);
    
    while(GetMessage(&msg,NULL,0,0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return TRUE;
}

HDC hdc;
PAINTSTRUCT ps;
void Draw(HDC hdc)
{
    double f;
    int y; 
    int prevmm=SetMapMode(hdc, MM_LOENGLISH); 
    SetViewportOrgEx(hdc, 280, 250, NULL);
    MoveToEx(hdc, -2000, 0, NULL); //X축 그림
    LineTo(hdc, 2000, 0);
    MoveToEx(hdc, 0, -2000, NULL); //y축 그림
    LineTo(hdc, 0, 2000);

    for (f=-500; f<1000; f++)
    {
        y = (int)(tan(f * 3.14159f / 180) * 100);
        SetPixel(hdc, int(f), y, RGB(255,0,0));
        y = (int)(sin(f * 3.14159f / 180) * 100);
        SetPixel(hdc, int(f), y, RGB(0,0,255));
    }
    SetMapMode(hdc,prevmm); 
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            Draw(hdc);
            EndPaint(hWnd, &ps);
            return 0;
        default:
            return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
}


?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
921 Etc [doc] 웜 프레임워크 검증환경 구축(작성중..) file hooni 2013.04.23 16013
920 Etc 여기저기서 모은 VoIP(인터넷전화) 자료들~ file hooni 2013.04.23 15966
919 Etc 티스토리 테이블 html,css 구문 hooni 2013.11.03 15942
918 System/OS [owasp] 10대 웹어플리케이션 보안 취약 file hooni 2013.04.23 15904
917 System/OS [linux] 패킷 스니퍼링 hooni 2003.04.23 15897
916 PPT [ppt] 웜 과제 진행사항(프레임워크 검증환경 구축) 보고 file hooni 2013.04.23 15895
915 System/OS 라우팅 경로 결정 영향 요소 ㅋㅋ file hooni 2013.04.23 15848
914 Develop OGNL(Object Graph Navigation Language) hooni 2013.04.23 15723
913 Etc 영어의 12 시제 (The twelve tenses of English) hooni 2013.07.12 15698
912 Develop [ios] APNS 클라이언트 구현 (pdf) file hooni 2013.06.27 15685
911 System/OS [router] 설정과 기본 명령어들 모음 hooni 2013.04.23 15670
» Develop [c] 윈도우 API sin 함수 출력.. file hooni 2013.04.23 15664
Board Pagination Prev 1 ... 17 18 19 20 21 22 23 24 25 26 ... 98 Next
/ 98