원형으로 출력하는 것이다.


 원형으로 출력을 하기 위해서 수학적으로 어떻게 해서 출력이 되는가? 라는 것을 생각할 필요가 있다.


 원형을 출력하기 위해서는 3가지 방법이 있다. 하지만, 필자는 2가지 방법 밖에 기억이 나지 않는다.

 또 다른 방식은 기억이 안나지만, 제대로된 방식이 아니라서 표현이 안되는 것으로 알고 있다.


 2가지 방식의 문제점은 2개의 독립 변수를 한개의 독립 변수로 표현하기 위해서 사용하다가 생기는 문제가 있기 때문에 생기는 문제이다.


 1. y^2 + x^2 = r^2 을 이용한 방식.(피타고라스 방식을 이용하는 것이라고 이해하면 될것이다.)


 이 방식은 완벽하게 출력이 되지 않지만, 반 원을 출력할 수 있는 방식이다.

 쉽게 말해서 완벽하게 원형을 출력할 수가 없다.


 이유는

 y = ±√(r^2-x^2) 이렇게 사용이 된다.


 이것은 + 부분과 - 부분을 이용해야 된다.


 +부분과 -부분을 따로 계산해야되기 때문에, 문제가 발생 할 수 있다.


 고등학교에서 말하는 원형을 표현하는 방법이다.



 2. 이 방식은 매개 변수를 사용하는 방식이다.


 쉽게 말해서 x^2+y^2 = r^2을 이용하는 방식이 아니다. 앞써 말한 2개의 독립 변수를 1개의 독립 변수로 움직이게 만들기 위해서 사용하다보니, 생기는 문제점이 있었다고 했다.


 이것을 매개변수라는 하나의 독립 변수로만 만들도록하고, 두개끼리 영향을 안 끼치는 방식을 채택한 것이다.


 식은 다음과 같다.

 width * sin(θ) + height * cos(θ) = f(θ) 이라는 형식이다.


 여기서 f(θ)이란, 원형 함수이다.


 width = height 일 경우에는 원.

 widht <> height 일 경우에는 타원.


 이런 방식을 이용해서 원과 타원을 그리는 함수를 표현하게 된다.


 θ라는 독립 매개 변수 1개를 이용하여, 표현 하기 때문에 앞에 나온 방식과 차이가 생기게 된다.

 그리고 θ가 얼만큼 가느냐에 따라서 호를 표현 할 수 있기도 하다.


 그런데, 이렇게 사용할려면, 전체적으로 각 Pixel을 찍어줘야하는 문제점이 있다.(윗 방식은 알아 두면 좋은 것이기 때문에 작성한 것이다.)


 Windows에서는 다음과 같은 함수가 지원해주기 때문에 굳이 알 필요는 없기도하다.


 Ellipse(

HDC hdc, // DC의 핸들.

int nLeftRect, // 사각형의 왼쪽 x 좌표.

int nTopRect, // 사각형의 상단 y 좌표.

int nRightRect, // 사각형의 우측 x 좌표.

int nBottomRect); // 사각형의 하단 y 좌표.


Arc(

HDC hdc, // DC의 핸들.

int nLeftRect, // 사각형의 왼쪽 x 좌표.

int nTopRect, // 사각형의 상단 y 좌표.

int nRightRect, // 사각형의 우측 x 좌표.

int nBottomRect, // 사각형의 하단 y 좌표.

int nXStartArc, // 그리기를 시작하는 x 지점.

int nYStartArc, // 그리기를 시작하는 y 지점.

int nXEndArc, // 그리기를 종료하는 x 지점.

int nYEndArc); // 그리기를 종료하는 y 지점.


 Chord(

HDC hdc, // DC의 핸들.

int nLeftRect, // 사각형의 왼쪽 x 좌표.

int nTopRect, // 사각형의 상단 y 좌표.

int nRightRect, // 사각형의 우측 x 좌표.

int nBottomRect, // 사각형의 하단 y 좌표.

int nXRadial1, // 그리기를 시작하는 x 지점.

int nYRadial1, // 그리기를 시작하는 y 지점.

int nXRadial2, // 그리기를 종료하는 x 지점.

int nYRadial2); // 그리기를 종료하는 y 지점.


 Pie(

HDC hdc, // DC의 핸들.

int nLeftRect, // 사각형의 왼쪽 x 좌표.

int nTopRect, // 사각형의 상단 y 좌표.

int nRightRect, // 사각형의 우측 x 좌표.

int nBottomRect, // 사각형의 하단 y 좌표.

int nXRadial1, // 그리기를 시작하는 x 지점.

int nYRadial1, // 그리기를 시작하는 y 지점.

int nXRadial2, // 그리기를 종료하는 x 지점.

int nYRadial2); // 그리기를 종료하는 y 지점.


 다음과 같은 것을 표현 하기 위해서 사용하는 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdlib.h>
 
#include <tchar.h>
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
 
WNDCLASS WndClass;
 
int numbers = 0;
 
int WINAPI WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpszCmdParam,
            int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    g_hInst = hInstance;
    
    //윈도우 클래스 초기화
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName="ApiBase";
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
 
    //윈도우 클래스 생성.
    RegisterClass(&WndClass);
    
    //윈도우 객체 생성.
    hWnd = CreateWindow("ApiBase",
                        "Test",
                        WS_OVERLAPPEDWINDOW,
                        10,// X
                        100,// Y
                        400,// Width
                        400,// Height
                        NULL,
                        (HMENU)NULL,
                        hInstance,
                        NULL);
    
    //윈도우 창 띄우기.
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0))
    {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    
    return Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    long dwStyle;
    
    switch(iMessage)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_LBUTTONDOWN:
            hdc = GetDC(hWnd);
            switch(numbers)
            {
                case 0:
                    Ellipse(hdc, 100100200200);
                    numbers++;
                    break;
                case 1:
                    Arc(hdc, 100100200200150100200150);
                    numbers++;
                    break;
                case 2:
                    Chord(hdc, 100100200200100200100150);
                    numbers++;
                    break;
                case 3:
                    Pie(hdc, 100100200200150100100150);
                    numbers=0;
                    break;
            }
            ReleaseDC(hWnd, hdc);
            break;
        case WM_PAINT:
            hdc = GetDC(hWnd);
            TextOut(hdc, 10050"Hello World",11);
            ReleaseDC(hWnd, hdc);
            break;
    }
    return DefWindowProc(hWnd,iMessage,wParam, lParam);
}
 
cs


Posted by JunkMam
,