mfc_graph_2 - 8BitsCoding/RobotMentor GitHub Wiki
기존의 sine을 그렸던 함수
// Dlg.cpp
// ShowGrid()
m_image_dc.SelectObject(&m_grid_pen);
m_image_dc.MoveTo(m_center_pos.x, 0);
m_image_dc.LineTo(m_center_pos.x, m_rect.bottom);
m_image_dc.MoveTo(0, m_center_pos.y);
m_image_dc.LineTo(m_rect.right, m_center_pos.y);
// Dlg.cpp
// ShowSine
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y;
double radian;
for(x = 0; x < m_step; x++) {
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sine(radian) * -100) + m_center_pos.y;
if(x) m_image_dc.LineTo(x, y);
else m_image_dc.MoveTo(x, y);
}
m_image_dc.SelectObject(&m_red_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// OnTimer
if(nIDEvent == 1) {
if(m_step < m_rect.right) m_step++;
else m_step = 1;
m_image_dc.FillSolidRect(m_rect, RGB(0, 0, 0));
ShowGrid();
ShowSine();
Invalidate(FALSE);
} else CDialogEx::OnTimer(nIDEvent);
cos을 그리는 부분을 추가해보자.
// Dlg.h
CPen m_cos_pen;
CBrush m_green_brush;
// OnInitDialog
m_cos_pen.CreatePen(PS_SOLID, 2, RGB(100, 255, 100));
m_green_brush.CreateSolidBrush(RGB(0, 200, 0));
// ShowCos
m_image_dc.SelectObject(&m_cos_pen);
int degree, x, y;
double radian;
for(x = 0; x < m_step; x++) {
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(cos(radian) * 100) + m_center_pos.y;
if(x) m_image_dc.LineTo(x, y);
else m_image_dc.MoveTo(x, y);
}
m_image_dc.SelectObject(&m_green_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
cos을 y축에 그려보자.
// ShowCos
m_image_dc.SelectObject(&m_cos_pen);
int degree, x, y;
double radian;
for(y = 0; y < m_step; y++) {
degree = y - m_center_pos.y;
radian = degree * PI / 180;
x = (int)(cos(radian) * 100) + m_center_pos.x;
if(y) m_image_dc.LineTo(y, x);
else m_image_dc.MoveTo(y, x;
}
m_image_dc.SelectObject(&m_green_brush);
m_image_dc.Ellipse(y - 20, x - 20, y + 20, x + 20);
sine, cos 함수를 동시에 그려보자
// Dlg.cpp
// ShowSine
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y, fix = m_center_pos.x - 360;
double radian;
for(x = 0; x < m_step; x++) {
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sine(radian) * -100) + m_center_pos.y;
if(x) m_image_dc.LineTo(x + fix, y);
else m_image_dc.MoveTo(x + fix, y);
}
x += fix;
m_image_dc.SelectObject(&m_red_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// ShowCos
m_image_dc.SelectObject(&m_cos_pen);
int degree, x, y, fix = m_center_pos.y - 360;
double radian;
for(y = 0; y < m_step; y++) {
degree = y - m_center_pos.y;
radian = degree * PI / 180;
x = (int)(cos(radian) * 100) + m_center_pos.x;
if(y) m_image_dc.LineTo(x, y + fix);
else m_image_dc.MoveTo(x, y + fix;
}
y += fix;
m_image_dc.SelectObject(&m_green_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
sine, cos을 이용하여 원을 그려본다.
// Dlg.h
int m_x, m_y;
// Dlg.cpp
// ShowSine
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y, fix = m_center_pos.x - 360;
double radian;
for(x = 0; x < m_step; x++) {
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sine(radian) * -100) + m_center_pos.y;
if(x) m_image_dc.LineTo(x + fix, y);
else m_image_dc.MoveTo(x + fix, y);
}
m_y = y;
x += fix;
m_image_dc.SelectObject(&m_red_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// ShowCos
m_image_dc.SelectObject(&m_cos_pen);
int degree, x, y, fix = m_center_pos.y - 360;
double radian;
for(y = 0; y < m_step; y++) {
degree = y - m_center_pos.y;
radian = degree * PI / 180;
x = (int)(cos(radian) * 100) + m_center_pos.x;
if(y) m_image_dc.LineTo(x, y + fix);
else m_image_dc.MoveTo(x, y + fix;
}
m_x = x;
y += fix;
m_image_dc.SelectObject(&m_green_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// OnTimer
m_image_dc.SelectObject(&m_circle_pen);
m_image_dc.SelectStockObject(NULL_BRUSH);
m_image_dc.Ellpise(m_center_pos.x - 100, m_center_pos.y - 100, m_center_pos.x + 100, m_center_pos.y + 100);
m_image_dc.SelectObject(&m_yellow_brush);
m_image_dc.Ellipse(m_x - 20, m_y - 20, m_x + 20, m_y +20);
x, y 축 선을 그리기
// Dlg.h
int m_sin_x, m_sin_y, m_cos_x, m_cos_y;
// Dlg.cpp
// ShowSine
m_image_dc.SelectObject(&m_sine_pen);
int degree, x, y, fix = m_center_pos.x - 360;
double radian;
for(x = 0; x < m_step; x++) {
degree = x - m_center_pos.x;
radian = degree * PI / 180;
y = (int)(sine(radian) * -100) + m_center_pos.y;
if(x) m_image_dc.LineTo(x + fix, y);
else m_image_dc.MoveTo(x + fix, y);
}
x += fix;
m_cos_x = x;
m_cos_y = y;
m_image_dc.SelectObject(&m_red_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// ShowCos
m_image_dc.SelectObject(&m_cos_pen);
int degree, x, y, fix = m_center_pos.y - 360;
double radian;
for(y = 0; y < m_step; y++) {
degree = y - m_center_pos.y;
radian = degree * PI / 180;
x = (int)(cos(radian) * 100) + m_center_pos.x;
if(y) m_image_dc.LineTo(x, y + fix);
else m_image_dc.MoveTo(x, y + fix;
}
y += fix;
m_sin_x = x;
m_sin_y = y;
m_image_dc.SelectObject(&m_green_brush);
m_image_dc.Ellipse(x - 20, y - 20, x + 20, y + 20);
// OnTimer
m_image_dc.SelectObject(&m_circle_pen);
m_image_dc.SelectStockObject(NULL_BRUSH);
m_image_dc.Ellpise(m_center_pos.x - 100, m_center_pos.y - 100, m_center_pos.x + 100, m_center_pos.y + 100);
m_image_dc.SelectObject(&m_yellow_brush);
m_image_dc.Ellipse(m_cos_x - 20, m_sin_y - 20, m_cos_x + 20, m_sin_y +20);
m_image_dc.MoveTo(m_sin_x, m_sin_y);
m_image_dc.LineTo(m_cos_x, m_sin_y);
m_image_dc.MoveTo(m_cos_x, m_cos_y);
m_image_dc.LineTo(m_cos_x, m_sin_y);