[과제] 클릭시 원과 네모를 출력하고 데이터를 추가한다.
-> https://cafe.daum.net/smhan/f9It/4
[과제] 용수철 진자를 구현해보자
1. 프로젝트 - 단일문서, 문서뷰 구조, 정적분할 윈도우(한쪽 View는 CFormView 사용)
프로젝트 만드는 순서는 다음과 같다.
1) 단일문서, 문서뷰 구조로 생성한다.
2) 정적분할 윈도우로 구성한다. (p504)
3) CFormView를 베이스 클래스로 하여 CMyFormView로 MFC 클래스를 추가한다.
4) MainFrame에서 splitView로 CMyFormView를 설정한다. (p507)
2. 용수철 저울 그리기. DrawSpring(int x,int y, int height)함수로 구현한다.
3. 늘었다 줄었다 하는 height 변화량은 물리학 계산식으로 구한다.
4. WM_TIMER를 사용하여 실시간으로 움직임을 표현한다.
샘플 프로그램 실행예:
* 샘플 프로그램 작성하기
동작 | 코드 |
움직임 동작하는 함수
WM_TIMER 메시지를 이용해서 움직임을 동작 시킨다. | OnTimer()함수 내에 다음과 같은 sin 값을 구해야 한다. sin()함수에 구한 결과(m_ypos) 값은 0~1 사이의 값이다. 구간은 0~2PI 사이값을 50개로 만들어 대입하면 구할수 있다.
#define _USE_MATH_DEFINES // for C++ #include <cmath>
void CChildView::OnTimer(UINT_PTR nIDEvent) { m_ypos = sin(m_xx); m_xx += 2 * M_PI / 50; if (m_xx > 2 * M_PI) m_xx = 0;
Invalidate(TRUE); CWnd::OnTimer(nIDEvent); } |
타이머 시작하기
왼쪽 버튼을 눌렀을 때 타이머를 동작시켜 OnTimer()함수를 실행시킨다. | SetTimer(1, 20,NULL); // OnTimer()함수 실행 |
스프링 그리기
OnPaint() 함수에서 DrawSpring() 함수를 사용하여 스프링을 그린다. | void CChildView::OnPaint() { CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
dc.SetROP2(R2_XORPEN);
// 이전에 그린 스프링은 지운다. DrawSpring(&dc, 200, 50, 100 + m_ypos * 50);
m_pos = 새로운 값 적용;
// 새로운 스프링을 그린다. DrawSpring(&dc, 200, 50, 100 + m_ypos * 50);
// 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오. } |
DrawSpring() 함수 구현
여러개의 Ellipse()함수를 사용한다. height에 따라 y좌표의 위치를 변경한다. 보통 10개를 그리면 된다.
| void CChildView::DrawSpring(CDC* pdc, int x,int y,int height) { // 스프링 ->Arc로 그리면 스프링처럼 보입니다. // 여기서는 타원으로 그려 움직이는 모양을 표현했다.
for (i=0; i < num; i++) { pdc->Ellipse(x - 20, y +20 + gap*i, x + 20, y + 20+ 10 + gap*i); } } |
상태편 View를 제어하기 | 1) 양쪽에서 상대편의 객체 포인터 멤버변수를 선언한다. 2) 상대편 객체의 포인터 (this) 를 넘겨받는다. Create() 또는 OnInitializeUpdate() 에서 this로 넘겨줄 수 있다. 3) 얻은 상대편 핸들을 이용하여 제어한다.
참고: https://cafe.daum.net/smhan/f9It/4
|
실습: 다음과 같은 용수철 진자의 단진동 움직임을 구현해보자.
단진동: 복원력에 의해 일정한 시간마다 같은 운동을 반복하는 주기적인 운동
F는 단진동의 복원력, a는 물체의 가속도, m은 물체의 질량, x는 변위값 (진동폭)
단진동의 주기 T는 다음과 같다. k는 용수철 상수, m은 추의 질량
참고: http://yjh-phys.tistory.com/126
학생작품
2024-1학기 조태진 학생
2023-1학기 조형근 학생
2023-1학기 고건희 학생
2021-1학기 이성원 학생
2021-1학기 김경석 학생