본문 바로가기

Studying/Python

15. miniProject(6) - hirst spot drawing (feat. turtle)

이번 글부터 자주 사용할 module 중 하나가 turtle  이다. 

 

turtle moduleTurtle, Screen 클래스는 거북이가 그림을 그리는 그래픽 창을 정의한다. 

 

쉽게 설명하면 간단한 그래픽을 그리는 명령을 거북이가 시뮬레이션하는 창을 띄우는 모듈이라고 이해하면 좋다. 

 

turtle에 대한 자세한 설명은 공식문서를 참고해보자. 

 

https://docs.python.org/3/library/turtle.html

 

turtle — Turtle graphics — Python 3.10.5 documentation

turtle — Turtle graphics Source code: Lib/turtle.py Introduction Turtle graphics is a popular way for introducing programming to kids. It was part of the original Logo programming language developed by Wally Feurzeig, Seymour Papert and Cynthia Solomon i

docs.python.org

 

우리는 turtle을 통해 아래와 같은 hirst painting 과 유사한 내용을 작성할 것이다. 

hirst drawing 예시

 

그렇다면 위와 같은 결과가 나오도록 작성해보자. 

 

먼저 turtleimport 한다. (turtle을 turtle_module로 별칭부여)

 

우리는 color_list에 해당하는 색깔을 무작위로 나타나게 할 것이고 (import random)

 

color_list (r, g, b)에 해당하는 tuplelist로 구성되어 있기 때문에 (color_list 작성과정은 맨 마지막에 추가 설명)

 

tuple들을 (r, g, b)값으로 인식할 수 있게 만들 turtle_module.colormode(255)를 작성한다. 

 

turtle 모듈에 있던 Turtle 클래스는 tim으로 설정하고, tim의 속성을 "fastest", "penup", "hideturtle"로 설정한다. 

(나타나는 속도를 가장 빠르게, 아직 화면에 그려지지 않게 펜을 들도록, 거북이없이 점만 출력할 것이기에 거북이 숨김) 

 

이제 우리 tim이 시작할 시작점을 정해야한다. 

 

화면 한 가운데를 (0, 0)으로 기준했을 때 tim의 머리가 향하는 방향을 통해 각도를 설정할 수 있다. 

 

tim.setheading(0) => 동쪽

tim.setheading(90) => 북쪽

tim.setheading(180) => 서쪽

tim.setheading(270) => 남쪽

 

우리는 화면 서남쪽 부근으로 이동해서 시작할 것이기 때문에 tim.setheading(225)tim.forward(250) 명령을 한다. 

 

250만큼 이동하고 다시 동쪽을 바라보게 tim.setheading(0)을 해준다. (점이 찍히는 방향이 서쪽에서 동쪽이니까)

 

우리가 그릴 점의 숫자는 100개, 따라서 number_of_dots = 100으로 설정한다. 

 

이제 점을 찍어보자. 

 

for 문을 통해 점을 찍고, 이동하는 과정을 반복한다. 

 

지름이 20이고, 색은 color_list에서 무작위로 가져올 원을 찍기 떄문에 tim.dot(20, random.choice(color_list))를 한다. 

 

그리고 다시 50만큼 앞으로 간다. 이 때 기본 설정이 penup으로 되어있으니까 '점 찍고 펜 들고 이동하고' 이 과정을 반복한다. 

 

그리고 우리는 10 X 10 짜리의 그림으로 만들어야한다. 즉 10번째, 20번째... 점들을 찍고 다음 줄로 이동해야한다. 

 

따라서 dot_counts의 10으로 나눈 나머지가 0이라면, (if dot_counts % 10 == 0)

 

해당 점을 찍고 머리 방향을 북쪽으로 돌리고 ( tim.setheading(90) )

 

50만큼 앞으로 간다. ( tim.forward(50) )

 

그리고 다시 서쪽으로 머리를 돌리고 ( tim.setheading(180) )

 

앞으로 500만큼 간다.  ( tim.forward(500) )

 

마지막으로 머리를 동쪽으로 돌리고 점찍을 준비를 한다. ( tim.setheading(0) )

 

맨 밑에 screen에 turtle 모듈의 Screen() 클래스를 할당하고 우리가 screen을 클릭했을때 종료되도록 설정한다. 

( screen.exitonclick() )


참고 - 색 추출하기

 

우리가 앞서 color_listtuple 형태로 (r, g, b) 값을 저장해둔 것을 기억해보자. 

 

물론 이 값을 직접 입력해도 상관없지만 귀찮아질 것이다. 

 

만약 우리가 어떤 이미지 에서 색을 추출하고 이를 (r, g, b) 형식으로 저장하여 사용한다면? 

 

이 때 우리는 colorgram module을 사용한다. 

 

 

colorgramimport 하고 extract 메소드를 사용한다.

 

extract를 사용할 때 추출할 파일 이름과 추출할 색의 수를 입력한다. 

 

그리고 추출한 값들을 저장할 빈 list를 만든다. ( rgb_colors = [] )

 

그리고 colors에 저장한 색들을 r, g, b로 구분하여 튜플로 만들고 이를 rgb_colors 리스트에 추가한다. 

 

rgb_colors 를 출력하여 출력된 값들을 복사하여 필요한 color_list에 붙여넣는다.