비트교육/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;
이렇게 바로 하면 어려우니까 하드코딩으로 그려보면서 규칙을 찾으면서 연습하는게 좋을 것 같아요.