스크래치 COS -시어핀스키다각형그리기
스크래치COS 코딩시험에서 알고리즘의 가장 핵심적인 부분이 변수, 반복문, 조건, 함수이다.
프랙탈(fractal)에 대해서 이해를 해보자. 프랙탈은 부분과 전체가 똑같은 모양을 하고 있다는 자기 유사성 개념을 기하학적으로 푼 구조를 말한다. 프랙탈은 단순한 구조가 끊임없이 반복되면서 묘한 전체 구조를 만다는 것으로, 즉 '자기 유사성(self-similarity)'과 '순환성(recursive)'이라는 특징을 가지고 있다.
이 용어는 IBM의 Thomas J. Watson 연구센터에 근무했던 프랑스 수학자 만델브로트(Benoit B. Mandelbrot) 박사가 1975년 '쪼개다'라는 뜻을 가진 라틴어 '프랙투스(fractus)'에서 따와 처음 만들었다. 만델브로트 박사는 저서 <the Nature of Geometry Fractal>에서 "영국의 해안선 길이가 얼마일까?"라는 물음을 던지고 있다. 리아스식 해안선에는 움푹 들어간 해안선 안에 굴곡진 해안선이 계속되었고, 자의 눈금 크기에 따라 전체 해안선의 길이가 달라졌고 결과적으로 아주 작은 자를이용하면 해안선의 길이는 무한대로 늘어나개 되는 것이다. 그는 이처럼 같은모양이 반복되는 구조를 '프랙탈'이라고 부르기 시작하였다.<출처 네이버 지식백과, 시사상식사전, 프랙탈 (naver.com)
예로 지난번에 시어핀스키 삼각형이 프랙탈의 하나의 모형이다. 아래 그림을 참고하세요
이번 글에서는시어핀스키 삼각형을 일반화하여 삼각형 대신에 다각형을 반복하는 프로그램을 작성할 것이다.
아래 그림은 8각형의 프랙탈 도형을 구현한 실행화면이다.
요구사항
* 다각형의 변의 길이를 입력받는다.
* 다각형의 변의 개수를 입력받는다.
- 원하는 도형을 그린다.
* 변수
- 길이 : 프랙탈 다각형 변의 길이를 저장한다.
- 변 : 프랙탈 다각형 변의 개수를 저장한다.
- 각도 : 프랙탈 다각형 각도를 저장한다.
* 시어핀스키 다각형 함수를 정의한다. (시어핀스키(길이))
- 변의 길이를 인자로 넘겨받는다.
- 시어핀스키 다각형을 그린다.
- 변의 개수만큼 반복하기
. n>3보다 크면(n은 변의 길이)
- 시어핀스크(n/2). <- 재귀함수
- n만큼 움직이기
- 각도 회전하기
-> 시어핀스키 다각형을 재귀함수를 활용하여 시어핀스키 다각형을 그린다.
. 재귀함수란 함수 바디에서 자신의 함수를 호출한다.
-> 더 자세한 내용은 시어핀스키 삼각형 글을 참고하세요
분석 및 설계
. 변수만들기
- 길이 : 다각형 한 변의 길이를 저장한다.
- 변 : 프랙탈 다각형 변의 개수를 저장한다.
- 각도 : 프랙탈 다각형 각도를 저장한다.
. 초기화
. 펜 올리기
. 펜 색깔 검정색
. 모두 지우기
. len 리스트 항목 모두 지우기(디버깅 목적)
. 스프라이트 (0,0) 위치로 이동하기
. 90도 방향보기
. 묻고 기다리기(변의 길이)
. 길이 변수에 '대답' 정하기
. 묻고 기다리기(변의 개수)
. 변 변수에 '대답' 정하기
. 시어핀스키(n) <- n : 변의 길이
- 변의 개수만큼 반복
. n > 3 이면
- 시어핀스키(n/2)
- n만큼 움직이기
- a도 돌기
블럭코딩
. 초기화 . 펜관련 초기화 : 펜 색깔, 모두 지우기 . 스크래치 위치 초기화 : (0,0) 위치로 이동하기, 90도 방향보기, 크기 10%로 정하기 . 길이 변수 묻고대답하기로 정한다. . 변 변수 묻고대답하기로 정한다. |
. 시어핀스키 함수 호출하기 |
. 시어핀스키(n) - 펜 내리기 - n 반복하기 . n>3이상이면 - 시어핀스키(n/2) - n만큼 움직이기 - 각도 돌기 |
* 실행 결과물
변의 길이를 묻고 기다리기한다. 예제로 변의 길이는 100을 입력한다.
. 변의 개수를입력한다. 여기서는 5를 입력하여 오각형을 그릴 것이다.
시어핀스키 다각형을 그리는 프로그램을 작성해보았다. 이번 프로그램에서는 재귀함수에 대해서 학습하였다.
재귀함수는 이해하기 어렵지만, len 리스트를 활용하여 어떻게 동작하는지 이해하고 추적해보았다.
좀 더 깊숙한 실행 화면은 추후에 설명을 별도로 재귀함수에 대해서 살펴보기로 하자.
이번에는 프랙탈 시어핀스키 삼각형을 확장하여 4각형, 오각형 육각형 등의 다각형을 그릴 수 있는 프로그램을 작성해보았다.
다시 한번 강조해서 말하지만, 변수의 값이 각 프로그램 단계별 순차적으로 어떻게 변화하는지 추척하는 것이 매우 중요하다. 블럭을 하나씩 쌓으면서 변수 볼륨 값의 변화를 살펴보자. 코딩은 눈으로 보면서 이해하고 학습하지만 직접 블럭을 쌓으며 이해하고 학습하는 것이 더 효과적이며 창의와 이해의 개념이 ~쑥 늘어납니다.
앞으로의 여러분의 모습을 기대합니다.
Just Do it!!!
Just Drag&Drop!!!
댓글