터틀 그래픽스 패키지 turtle

admin의 아바타

http://tcltk.co.kr/drupal/index.php?q=node/57
http://tcltk.co.kr/drupal/index.php?q=node/61

터틀 그래픽스(Turtle Graphics)란?

터틀 그래픽스란 커서가 이동한 후 남기는 흔적이 거북이가 모래사장에서 이동하면서 남기는 흔적과 비슷하여 붙여진 이름입니다.

설치

설치 방법에는 크게 두가지가 있습니다. 확장 패키지 자료실에 있는 터틀 그래픽스는 확장 패키지 입니다. 일단 zip 파일을 다운로드 받으셔서 적당한 디렉토리에 압축을 풉니다. 그러면, turtle라는 디렉토리가 풀려나옵니다. 여기서 두가지로 나뉩니다.

  • 풀려진 디렉토리를 tcl의 라이브러리 디렉토리에 복사를 합니다. 일반적으로 경로명은 c:/tcl/lib 입니다. 이제 package require turtle 라는 명령어로 바로 패키지를 소스에 포함하여 사용할 수 있습니다.
  • 풀려진 디렉토리의 경로명을 기억합니다. 그리고, 풀려진 위치의 lappend auto_path 경로명 (예:c:/source)/turtle) 을 소스에 넣어주고, 그 다음에 package require package라는 명령어로 패키지를 소스에 포함합니다.

저는 개인적으로 첫번째 방법을 선호합니다. 최소한 소스를 작성할 때 한 줄은 줄일 수 있으니까요.

명령어

제가 개인적으로 Tcl/Tk용으로 구현한 것이라 다른 언어의 터틀 그래픽스와는 상이할 수 있습니다. (거북이라는 뜻은 화살표 커서를 이야기 하는 것이며, 모래사장은 거북이가 움직일 캔버스를 뜻합니다. 그리고 흔적은 거북이가 이동하면서 그려진 선을 이야기 합니다.)

명령어 설명
tStart 터틀 그래픽스를 시작합니다. 터틀 그래픽스는 항상 이 명령어로 시작합니다.
tforward n n만큼 거북이를 이동시킵니다. 디폴트로 흔적이 남습니다.
tbackward n 거북이를 거꾸로 돌려 n만큼 거북이를 이동시킵니다. tforward 처럼 흔적이 남습니다.
tleft n 거북이를 반시계 방향으로 n만큼 각도를 돌립니다.
tright n 거북이를 시계 방향으로 n만큼 각도를 돌립니다.
tup 거북이가 이동할 때 흔적이 남지 않도록 합니다.
tdown 거북이가 이동할 때 흔적이 남도록 합니다. 디폴트 입니다.
tdelayset n 거북이를 n만큼 이동을 지연시킵니다. 단위는 ms입니다. tcl 8.3 버전부터 ms를 제공하니 tcl 버전이 8.3 이상은 되어야겠지요. 이 글을 작성하는 지금 발표된 버전은 8.4.5 버전입니다.
tsetxy x y 거북이를 좌표 x, y로 점프시킵니다. 점프를 하니깐 당연히 흔적은 남지 않겠지요.
thome 거북이를 처음 시작 위치로 점프시킵니다. 좌표는 x:100 y:100 입니다.
tclear 거북이만 남겨두고 모든 흔적을 지웁니다.
tclearscreen 거북이를 처음 시작 위치로 이동시키고, 모든 흔적을 지웁니다. 거북이를 가지고 놀다가 처음부터 다시 하고 싶을 때 사용하면 됩니다. 초기화 같은 겁니다.
tsetsize n 거북이의 크기를 n으로 변화시킵니다. 거북이의 크기가 변하니, 흔적의 크기도 변합니다.
tsetcolor ?args? 거북이의 색깔을 변화시킵니다. 그리고 앞으로 남을 흔적의 색깔도 변화시킵니다. ?args?를 적지 않으면, 칼라 팔레트가 나오며, 그곳에서 색깔을 지정하시면 됩니다.
tsetbgcolor ?args? 모래사장의 색깔을 변화시킵니다. ?args?를 적지 않으면 칼라 팔레트가 나옵니다.
tinfo 터틀 그래픽스의 정보를 출력합니다. 거북이의 x좌표(turtle X position), 거북이의 y좌표(turtle Y position), 거북이의 진행방향(turtle degree), 거북이의 크기(turtle width), 거북이 색깔(turtle color), 모래사장 색깔(turtle canvas color), 모래사장의 길이(turtle canvas width - 버그가 있습니다. 모래사장의 크기를 변화시켜도 처음 모래사장의 크기가 출력됩니다. ), 모래사장의 높이(turtle canvas height - 모래사장의 길이와 같은 버그가 있습니다.), 거북이의 흔적 유무정보(turtle draw - 1:흔적있음 0:흔적없음), 거북이 이동시의 지연정도(turtle delay)

다음으로 넘어가기 전에

제가 기하학쪽에서 손을 뗀지가 꽤 된 관계로 복잡한 부분은 잘 설명을 못 드리겠구요. 터틀 그래픽스를 살펴보면서 이 사이트 저 사이트에서 배우게 된 부분들을 설명 드리겠습니다. 패키지를 앞에서 설명드린 첫번째의 방법 즉, 터틀 그래픽스 디렉토리를 tcl 라이브러리에 복사해 넣었다고 생각하고 진행하겠습니다. 라이브러리에 복사하지 않으신 분은 첫 줄에 lappend auto_path (경로명)/turtle 를 추가해 주시면 됩니다. wish창과 wish 콘솔창을 사용하시면 쉽게 각 행동들을 살펴보실 수 있습니다. 각 예제를 실행해 보신 이후에 다음 예제를 보시기 전에 tclearscreen를 적어주시면 화면이 처음상태로 돌아갑니다. 터틀 패키지를 처음 실행할 때 tStart 라는 명령어를 사용하는 걸 잊지 마세요. 딱 한 번만 적어주시면 됩니다.

터틀 그래픽스의 간단한 시작

아래 그림은 터틀을 시작한 그림입니다.

그림에서 보시는 바와 같이 2줄로 간단히 시작할 수 있습니다. 첫번째 package require turtle로 패키지를 불러오고, tStart 명령어로 터틀 캔버스를 초기화 합니다. 이제 아래와 같은 사각형을 그려 볼까요?

소스는 아래에 있습니다.

tforward 100
tright 90
tforward 100
tright 90
tforward 100
tright 90
tforward 100

위와 같이 100 픽셀 이동, 90도 시계방향회전을 4번 반복하면 됩니다. 시계방향 회전이 3번이라구요? 4번 해도 상관없습니다. 위의 소스를 for문을 사용하여 간단히 아래와 같이 고칠 수 있습니다.

for {set i 0} {$i < 4} {incr i} {
   tforward 100
   tright 90
}

이제 어느정도 이해가 가시나요? 선을 가지고 그림을 그리는 정도로 이해하시면 됩니다. 이후에 어느정도 실력이 늘면 아주 복잡하기도 하지만 복잡한 그림을 그릴 수도 있지요.

색깔과 선 굵기

자 이제 직선에 색깔을 이쁘게 넣어 보겠습니다.

이쁘지 않다구요? 이쁩니다. 소스를 잠깐 살펴볼까요?

1: set lcolor {black gray red pink green blue yellow magenta cyan purple brown orange}
2:
3: foreach color $lcolor {
4:    tsetcolor $color
5:    tforward 20
6: }
7:
8: tup
9: tright 90
10: tforward 50
11: tright 90
12: tdown
13: tsetsize 10
14:
15: foreach color $lcolor {
16:    tsetcolor $color
17:    tforward 20
18: }

1번 줄에서 lcolor이라는 색상을 담고 있는 리스트를 만들었습니다. foreach를 사용해서 tsetcolor라는 함수에 색상을 주고 흔적의 색깔을 변화시키고 20픽셀씩 전진 시켰습니다. 그림에서 위의 선이지요. 이제 8번 줄에서 tup을 사용해서 거북이가 흔적을 남기지 않도록 하고 trighttforward 명령어를 사용해 아래로 내려옵니다. 12번 줄에서 tdown을 사용하여 흔적을 남기도록 합니다. 그리고, 13번 줄에서 선의 굵기를(거북이의 크기를) 10픽셀로 지정했습니다. 이제 다시 foreach 문으로 각 칼라를 부여하며 20픽셀씩 이동했습니다. 이제 거북이의 크기 지정과 색상 지정이 이해가 가시나요? 참고로 색상에는 위의 예에서와 white같은 직접적으로 색상명을 적어도 되지만, RGB칼라를 이용합니다. RGB 칼라는 #000000 ~ #FFFFFF 범위로 나타내는 색상을 말합니다. RGB 색상에 관해서는 더이상 물어보셔도 모릅니다.

모래사장 색깔을 한 번 바꿔볼까요?

위 소스에

tsetbgcolor #DAA520

만 추가하면 됩니다. 일명 똥밭 입니다. 지금까지 거북이와 흔적에 관한 간단한 예를 보았습니다. 좀더 복잡한 그림으로 가봅시다.

다각형 그리기

다각형을 한 번 그려보겠습니다. 간단한 함수로 n각을 가지는 그림을 그릴 수 있습니다. 5각형을 한 번 그려볼까요?

proc draw n {
   for {set i 0} {$i < $n} {incr i} {
      tforward 25
      tright [expr 360 / $n]
   }
}
 
draw 5

원을 그릴려면? n에 360을 주면되겠죠. 그런데, 25픽셀씩 전진하기 때문에 대단히 큰 원이 그려집니다. 원의 크기를 조정하기 위해서는, tforward 25를 tforward 1로 바꾸면 됩니다.

사실 원이라기 보다는 360각형이라고 표현하는게 맞겠지만 육안으로는 원으로 보이잖아요. 창의 크기가 변하는건 캡쳐하기 편하게 창을 요리조리 당겼다 밀었다 했기 때문입니다.

좀더 복잡한 모양

복잡한 모양이라기 보다는 패턴이 조금 더 반복되는 겁니다. 우선 스샷을 한 방...

멋집니까? 소스를 볼까요?

proc draw {} {
   for {set i 0} {$i < 6} {incr i} {
      for {set j 0} {$j < 6} {incr j} {
         tforward 25
         tright 60
      }
 
      tright 60
   }
}
 
draw

단 몇 줄만으로 멋진 모양을 만들 수 있습니다.

좀더 좀더 복잡한 모양을 위해

여기까지 보셨으면, 터틀 그래픽스로 무엇을 할 수 있는지 아셨을겁니다. 이제 좀 더 복잡한 모양은 이곳 저곳을 찾아보면 나오겠지요. 한글로 잘 정리되어 있는 곳은 http://people.linuxkorea.co.kr/~yong/python/study/turtle/ 이만용님의 터틀 강좌입니다. 파이썬으로 작성되어 있는데 앞에 제가 적은 소스가 그 곳 소스를 일부 발췌한 형태이기 때문에 파이썬을 전혀 만져보지 않으셨어도, 쉽게 Tcl/Tk 문법으로 고치실 수 있으리라 생각됩니다. 그리고, http://google.co.kr 에서 [turtle graphics] 라고 검색을 해보시면 엄청난 형태의 기하학적 모양들을 만나 보실 수 있고, 계산 식도 구하실 수 있습니다. 여기까지 보시느라 수고하셨습니다.

첨부 파일파일 크기
112.jpg36.46 KB
113.jpg11.36 KB
114.jpg13.25 KB
115.jpg13.08 KB
116.jpg8.67 KB
117.jpg11.35 KB
118.jpg11.71 KB
112.jpg11.43 KB
112.jpg11.43 KB