본문 바로가기

Python/파이썬 프로젝트

[모듈 2-8] 거북이 그림 그리기 파이썬 프로젝트

1. 좌표계의 이해

 

- 코드 타이핑

import turtle as t # 그림그려주는 거북이 패키지 임포트

t.forward(200) # 200픽셀만큼 화살표 전진

t.exitonclick()  # 출력된 그림 클릭시 창을 닫아주는 명령어

 

- 결과

 

 

Q. turtle 패키지 함수는 어떤 좌표계를 사용하는가?

 

 

1) AWT 좌표 시스템

 

 

 

2) 데카르트 좌표 시스템

 

 

 - turtle 패키지는 데카르트 좌표 시스템 기반임을 알수 있다. 

 - 하지만 많은 컴퓨터 그래픽 함수들은 1) AWT 좌표 시스템 기반으로 동작함을 알고 가자.

 - t.forward(200) 의 200은 픽셀값이다. 

 

 

 

 

2. turtle 기본 함수 (1)

import turtle as t # 그림그려주는 거북이 패키지 임포트

t.speed(1)  # 속도를 숫자로 표시. 0~10까지 숫자.t.forward(300)  #전진 300픽셀(x축 양의 방향)
t.forward(200)   #전진 200픽셀
t.left(90)     #왼쪽으로 회전 90도

t.shape('turtle')  #커서모양 '거북이'로 변경
t.forward(200)   #전진 200픽셀

t.left(90)      #왼쪽으로 회전 90도
t.color('red')  # 색 빨간색으로 변경
t.fd(300)       #forward 와 같은 명령어, 줄임말

t.left(90)      #왼쪽으로 회전 90도
t.color('purple')  # 색 보라색으로 변경
t.speed(5)  # 속도를 숫자로 표시. 0~10까지 숫자.
t.fd(500)

t.exitonclick()  # 출력된 그림 클릭시 창을 닫아주는 명령어

 

 

- 결과

 

그런데 여기서 잠깐,

 

t.shape('turtle')  #커서모양 '거북이'로 변경

 

여기서 거북이 말고 어떤 모양들이 더 있을까?

 

구글에서 어떻게 검색하면 알수 있을까?

 

 

- 보통 구글링 맨 위에 검색 되는 것이 가장 정확하다. 

- 파이썬 공식 라이브러리 설명서

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

 

turtle — Turtle graphics — Python 3.9.0 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

 

문서의 양이 어마어마하다.

 

 

ctr + f 기능을 사용하여 shape를 검색해 본다.

오호라 이러한 모양들이 있음을 알수 있다.

 

또한 검색의 고수라면

getshape()함수를 통해 현재 등록된 모양을 확인할수도 있고, register_shape() 함수를 통해 모양을 더 등록 할 수 도 있다.

 

 

print 함수를 통해 모양을 확인해 본다.

 

 

이렇게 모양을 바꿀수 있다.

 

이렇게 검색을 통해 패키지에 있는 함수와 속성들을 스스로 공부할 수 있다.

 

영어공부와 푹풍검색은 프로그래밍 고수가 되기 위한 필수적으로 동반되는 고난이 아닐까 생각해 본다.

 

 

 

3. turtle 기본함수 (2)

 

- 코드 타이핑

import turtle as t # 그림그려주는 거북이 패키지 임포트

t.shape('turtle')  #커서모양 '거북이'로 변경
t.color('red')    # 색 빨간색으로 변경
t.speed(2)
t.fd(200)         # 200픽셀 전진

t.left(90)     #왼쪽으로 회전 90도
t.pensize(5)   # 선굵기 지정
t.fd(200)

t.left(90)
t.bgcolor('blue')  # 선 배경 색 지정정
t.fd(300)

t.left(90)
t.penup() # 펜들기 -> 그림 안그리고 거북이만 이동
t.fd(200)

t.left(90)
t.pendown() # 펜다운 -> 다시 그림 그림
t.fd(100)

t.exitonclick()  # 출력된 그림 클릭시 창을 닫아주는 명령어

 

 

- 결과

 

 

4. goto 함수

- 기본코드

import turtle as t # 그림그려주는 거북이 패키지 임포트

t.shape('turtle')  #커서모양 '거북이'로 변경
t.color('red')    # 색 빨간색으로 변경

t.speed(2)
t.goto(100,100) # 해당 좌표로 거북이 즉시 이동

t.goto(100,-100)

t.goto(-100,-100)

t.goto(-100,100)

t.goto(100,100)

t.exitonclick()  # 출력된 그림 클릭시 창을 닫아주는 명령어

 

- 결과

 

 

5. 함수 만들어서 사용하기

import turtle as t

def box(x, y): # box라는 함수 생성
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.fd(x)
    t.left(90)
    t.fd(y)

box(100, 50) # (0,0)과 (100, 50)을 지나는 직사각형 그리기

t.exitonclick()  # 출력된 그림 클릭시 창을 닫아주는 명령어

 

 

[도전 과제 1]

 

아래와 같이 color라는 입력 변수를 함수에 추가하여 box 함수를 사용하여 빨간 사각형을 그려 보시오.

def box(x, y, color): # box라는 함수 생성

 

결과값

 

 

 

 

 

6. 우리의 목표확인

우리는 이러한 사람을 그려 보려고 한다.

 

 

- 소스 코드

import turtle as t
 
def box(x,y,color):
    t.speed('normal') # 속도증가; slowest,slow,normal,fast,fastest
    t.color(color)
    t.begin_fill() # 색깔채우기, 시작부분 코드
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.end_fill() # 색깔채우기, 종료부분 코드
     
#foot
t.penup()
t.goto(-100,-150)
t.pendown()
box(80,50,'blue')

t.exitonclick() 

 

 

[도전 과제 2] #foot 부분을 추가하여 아래와 같이 다리 2개를 완성해 보시오.

 

 

 

 

 

 

 

 

 

- 코드 확인

import turtle as t

def box(x,y,color):
    t.speed('normal')
    t.color(color)
    t.begin_fill()
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.end_fill()
    t.left(90)  # 90도 회전 명령 추가.


# foot
t.penup()
t.goto(-100, -150)
t.pendown()
box(80, 50, 'blue')

t.penup()
t.goto(0, -150)
t.pendown()
box(80, 50, 'blue')

t.exitonclick() 

 

Q. 그림을 그리는 상황에서 box() 함수를 사용할때 반복되는 코드는 무엇인가?

 

 

 

Q. 반복되는 코드를 효율적으로 하는 방법은 무엇이 있을까?

 

 

 

 

[도전과제 3] 아래와 같이 start_x, start_y 입력 변수를 추가하여 t.penup(), t.goto( _ , _ ) , t.pendown() 에 대한 내용을 box()함수에 넣어 불필요한 코드의 반복을 줄여라.

 

def box(start_x,start_y,x,y,color): #goto()로 전달될 매개변수 pos_x,pos_y 추가.

 

기본 코드는 짜드림.

import turtle as t

def box(start_x,start_y,x,y,color): #goto()로 전달될 매개변수 pos_x,pos_y 추가.
    # 코드추가
    # 코드추가
    # 코드추가
    
    #기존 코드
    t.speed('normal')
    t.color(color)
    t.begin_fill()
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.end_fill()


#foot 다시 그리기
box(-100,-150,80,50,'blue')
box(   0,-150,80,50,'blue')

t.exitonclick() 

 

 

 

 

 

 

 

 

 

 

[최종 동작 확인]

 

 

 

- 좌표 찾는게 쉽지 않아 동작코드를 전부를 첨부한다.

import turtle as t

def box(start_x,start_y,x,y,color):
    t.penup()
    t.goto(start_x - x/2,start_y - y/2)  #시작점을 약간의 계산을 통해서 변경.
    t.pendown()

    #기존 코드
    t.speed('normal')
    t.color(color)
    t.begin_fill()
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.fd(x)
    t.left(90)
    t.fd(y)
    t.left(90)
    t.end_fill()


# foot
box(-50, -150, 80, 50, 'blue')
box(50, -150, 80, 50, 'blue')

# leg
box(-50, -80, 20, 100, 'red')
box(50, -80, 20, 100, 'red')

# body
box(0, 50, 150, 150, 'yellow')

# arm
box(120, 70, 80, 20, 'green')
box(-120, 70, 80, 20, 'green')

# head
box(0, 160, 80, 70, 'pink')

# eye
box(10, 170, 10, 10, 'black')
box(-10, 170, 10, 10, 'black')

# mouth
box(0, 150, 30, 10, 'black')

t.hideturtle()  # 커서감추기

t.exitonclick()

 

 

 

@ Edit by wonking.

 

자료 출처 : 이고잉님의 오픈튜토리얼

opentutorials.org/course/3186/17298