더북(TheBook)

[프로그램 1.5.7](bouncingball.py)은 중심을 원점을 하는 2 × 2 사각형 안에서 움직이는 것처럼 보이는 공을 만드는 과정을 구현한다. 공의 현재 위치는 (rx, ry)이고 루프를 반복할 때마다 rxvx를, ryvy를 더해 새로운 위치를 계산한다. (vx, vy)는 시간 단위마다 공이 움직이는 거리이므로, 공의 속도를 나타낸다. 공이 캔버스 밖으로 빠져나가지 않도록 탄성 충돌 법칙에 따라 공이 벽에 튕기는 효과를 시뮬레이션한다. 이 효과는 구현하기 쉽다. 공이 수직 벽에 닿으면 x축 속도 vx를 -vx로, 공이 천장이나 바닥에 닿으면 y 속도 vy를 -vy로 바꾸면 된다. 코드를 직접 작성해 움직이는 모습을 직접 눈으로 확인해보라.

종이에는 움직이는 이미지를 인쇄할 수 없으므로 다음 코드 예제에서는 공이 지나간 자리를 보여주도록 bouncingball.py를 약간 수정했다([연습문제 1.5.34] 참조).

bouncingball.py의 여러 파라미터를 변경해 공을 더 크게 만들어보고, 더 빠르거나 느리게 움직이게 만들어보면서 시뮬레이션 속도와 화면 위에 보이는 속도 간의 차이도 실험해 보면서 컴퓨터 애니메이션에 친숙해지길 바란다. 파라미터를 모두 명령 줄 인수로 받도록 bouncingball.py를 수정하면 다양하게 실험하기 편하다.

표준 그래픽스는 ‘천 마디 말보다 한 장의 그림’ 요소를 추가함으로써 프로그래밍 모델을 훨씬 더 좋게 만들어준다. 그림은 자연적인 추상화 메커니즘으로서 프로그램을 외부 세계에 한 발자국 더 가까워지게 만든다. 그래픽스를 이용해 과학과 공학에서 널리 사용되는 함수 그래프를 생성하고 데이터를 시각적으로 표현할 수 있다. 이 책에서는 앞으로 그래픽스를 종종 활용할 것이다. 이번 절 뒤에 나오는 여러 샘플 프로그램과 예제를 분석, 구현, 변경하면서 실험해보기를 바란다. 시간 투자 가치가 충분히 있다. 이번 절 뒤에 나오는 stddraw 모듈 활용 연습문제를 풀다 보면 여러 가지 기발한 생각이 나올 것이다. 뾰족한 부분이 n개 있는 다각별은 어떻게 그릴 수 있을까? 튕기는 공에 현실감을 줄 수는 없을까(중력 추가)? 이런 류의 문제를 얼마나 쉽게 풀 수 있는지 알게 되면 깜짝 놀랄 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.