비트교육/API

API(8) -window destop으로 선 원 sin그래프 그리기

ballde 2020. 9. 7. 18:36

선, 원 ,sin그래프 등을 그려보도록 하겠습니다.

선을 그리는 방법1

MoveToEx(hdc, 10, 10, NULL);          //선의 시작지점 
LineTo(hdc, 200, 400);                //선을 그려주고 다른 한점을 나타낸다. 
LineTo(hdc, 400, 200);

MoveToEx로 선의 시작지점을 나타내주고

LineTo로 다른 점을 나타내주고 선을 나타내 주는 함수입니다.

 

그러면 이제 삼각형을 그려보도록 하겠습니다. 

그냥 해도 되긴 하는데 이왕이면 수학적으로 접근해보도록 하겠습니다. 

그러면 선행되어야 할 학습이 있습니다. sin, cos을 알아야하는데요 . 

여기에서 y/x=cos()이고 t/x=sin() 인것은 알고 있다고 생각하겠습니다.

이렇게 원을 그렸을 경우 x, y좌표를 알수 있습니다. 

이것을 토대로 삼각형을 그리는 코드를 짜보세요 .

 

ㅎㅎ 자바스크립트로 답 누르면 나오게 하려고 했는데 자바스크립트가 안먹네요ㅎㅎ 

tistory javascript 사용법 알면 댓글 달아주세요.

WM_PAINT부분에

#define _PI 3.141592f
float degreeToRadian(float degree) {
    return _PI * degree / 180.0f;
}
RECT rt;
GetClientRect(hWnd, &rt);
// 만약 윈도우 창의 크기가 바뀌어도 코드를 수정 할 필요가 없다. 
//반지름 200, 화면 중앙에 삼각형 그리기
float PosX = rt.right / 2.0f, PosY = rt.bottom / 2.0f;
MoveToEx(hdc, 200 * cosf(degreeToRadian(-90.0f))+PosX, 200 * sinf(degreeToRadian(-90.0f))+PosY,NULL);
LineTo(hdc, 200 * cosf(degreeToRadian(-(90.0f+ 120.0f)))+ PosX, 200 * sinf(degreeToRadian(-(90.0f+120.0f)))+ PosY);
LineTo(hdc, 200 * cosf(degreeToRadian(-(90.0f+210.0f)))+ PosX, 200*sinf(degreeToRadian(-(90.0f+210.0f)))+ PosY);
LineTo(hdc, 200 * cosf(degreeToRadian(-90.0f)) + PosX, 200 * sinf(degreeToRadian(-90.0f)) + PosY);

이것을 응용하면 원도 그릴수 있습니다. 

 

Rectangle(hdc, 100, 100, 200, 300);        // 좌 상 우 하
Ellipse(hdc, 200, 300, 400, 500);

직사각형과 타원형도 그릴 수 있습니다. 

 

그러면 이러한 삼각형을 그렸을 경우 선의 색이나 굵기, 안에 색도 바꿔 보도록 하겠습니다.

HPEN MyPen, OldPen; 
MyPen = CreatePen(PS_SOLID, 5, RGB(0, 0, 255));     //펜type, 굵기 , 색
OldPen = (HPEN)SelectObject(hdc, MyPen);   //펜을 몇가지 사용 할 경우에 백업용     //타입을 맞춰주려고 타입캐스팅 한 것 

HBRUSH MyBrush, OldBrush;
MyBrush = CreateSolidBrush(RGB(255, 255, 0));
OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);

Rectangle(hdc, 100, 200, 300, 400);

SelectObject(hdc, OldPen);         //
DeleteObject(MyPen);               //createpen하고 짝

SelectObject(hdc, OldBrush);        
DeleteObject(MyBrush);

 

선을 그리는 방법2

 POINT pts[] = {
                {60,10}, {160,10}, {210,60}
            };
Polyline(hdc, pts, 3);            // hdc,  pts의 주소, 개수 
            

이런식으로도 그릴 수 있습니다. 

 

이 방식으로 sin그래프를 그려보는 연습을 해볼게요.

 //sin그래프 만들기
POINT pts[360];
#define NUM 360
for (int i = 0; i < NUM; i++)
{
// pts[i] = { 10*(i)*0.0f +400 , 100* sinf(degreeToRadian( (i)+0.0f)) +300 };
pts[i].x = (i)  + 400;
pts[i].y = 100 * sinf(degreeToRadian(((360.0f/NUM)*i) )) + 300;
}

배열로 말고 포인터 (이게 더 좋은 코드라고 합니다.)

int NUM = 360;
POINT *pts = new POINT[NUM];
//#define NUM 360
            
for (int i = 0; i < NUM; i++)
{
// pts[i] = { 10*(i)*0.0f +400 , 100* sinf(degreeToRadian( (i)+0.0f)) +300 };
pts[i].x = (i)+400;
pts[i].y = 100 * sinf(degreeToRadian(((360.0f / NUM) * i))) + 300;
}
Polyline(hdc, pts, 360);
//메모리 해제해주기 
delete []pts;

 이렇게 바로 하면 어려우니까 하드코딩으로 그려보면서 규칙을 찾으면서 연습하는게 좋을 것 같아요.