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);