요즘 과제시즌인지.. Turtle관련 도형 그리기 질문이 많이들어와서 소스를 짜봤습니다.
문과계열 학생들이.. 파이썬이 필수과정으로 들어가며 고통받는다는데 많은 도움이 되셨으면 합니다.
먼저 제 소스를 보면 아시겠지만 turtle.forward, turtle.right 요거 두개만 주로 쓰기 때문에 따로 코드 설명할꺼는 없는것 같습니다.
객체형태로 재사용 가능하게끔 만들었고, 과제하실때 소스코드 참고하셔서 만들수 있으면 좋을거 같습니다.
import turtle
import math
turtle.shape('turtle')
class Myturtle:
def __init__(self, turtle, speed=2, angle=0):
self.turtle = turtle
self.speed = speed
self.angle = angle
self.turtle.speed(speed)
self.turtle.setheading(angle)
def __del__(self):
self.turtle.mainloop()
def draw_triangle(self, size):
""" 정삼각형 그리기 """
for i in range(3):
self.turtle.forward(size)
self.turtle.right(120)
def draw_square(self, size):
""" 정사각형 그리기 """
for i in range(4):
self.turtle.forward(size)
self.turtle.right(90)
def draw_polygon(self, size, cnt):
""" 다각형 그리기 """
for i in range(cnt):
self.turtle.forward(size)
self.turtle.right(360 / cnt)
def draw_circle(self, size):
""" 원 그리기 """
self.turtle.circle(size)
def draw_star(self, size):
""" 별 그리기 """
for i in range(5):
self.turtle.forward(size)
self.turtle.right(144)
def draw_triangle_recursive(self, size, depth):
""" 재귀적인 삼각형 그리기 """
if depth == 0: return
self.draw_triangle(size)
self.turtle.forward(size/2)
self.turtle.right(60)
self.draw_triangle_recursive(size/2, depth - 1)
def draw_polygon_recursive(self, size, cnt, depth):
""" 재귀적인 다각형 그리기 """
if depth == 0: return
self.draw_polygon(size, cnt)
self.turtle.forward(size/2)
self.turtle.right(180 / cnt)
self.draw_polygon_recursive(size*math.cos(math.radians((180-180*(cnt - 2)/cnt)/2)), cnt, depth - 1)
def draw_snow_recursive(self, size, cnt, scale, depth):
if depth==0: return
for i in range(cnt):
self.turtle.forward(size)
self.draw_snow_recursive(size*scale, cnt, scale, depth-1)
self.turtle.backward(size)
self.turtle.right(360/cnt)
def fill_color_start(self, color):
self.turtle.fillcolor(color)
self.turtle.begin_fill()
def fill_color_end(self):
self.turtle.end_fill()
def reset(self):
""" 초기 상태로 되돌림 """
self.turtle.reset()
self.turtle.speed(self.speed)
self.turtle.setheading(self.angle)
@staticmethod
def draw_repeat(size, scale, angle, cnt, draw_shape):
""" 반복해서 일정각도를 틀며 도형을 그리는 함수 """
for i in range(cnt):
draw_shape(size)
turtle.right(angle / cnt)
size *= scale
위 소스가 제가 만들어둔 Myturtle 객체입니다. 이제 이걸 활용해서 다양한 도형을 그려보도록 합시다.
아래 예제를 따라하기 전에 위에 소스를 전부 작성한 상태에서 진행하시면 됩니다.
삼각형 그려보기
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_triangle(100)
먼저 Myturtle에 인자를 넣어줄건데, turtle 모듈과, 거북이 속도, 시작시 거북이가 바라보는 각도를 초기값으로 넣어줄 것입니다. 그리고 draw_triangle(한변의 길이)를 호출해주시면 삼각형을 그려줍니다.
다각형 그려보기
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_polygon(100, 5)
draw_polygon(한변의길이, 몇각형인지) 써주시면 다각형읠 그릴 수 있습니다.
별 그려보기
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_star(100)
draw_start(한변의 길이) 써주시면 되겠습니다.
반복해서 그림을 지우고 다시 그리기
myturtle = Myturtle(turtle, 2, -135)
while True:
myturtle.draw_star(100)
myturtle.reset()
while구문으로 반복적으로 그림을 그리게 명령을 하고, reset 메소드를 이용하여 그렸던 그림을 초기화하고 초기설정대로 세팅되게 할 수 있습니다.
재귀적으로 다각형 도형이 내부에 그려지고 싶게하고 싶다면 이 메소드를 써보세요
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_polygon_recursive(200, 6, 8)
draw_polygon_recursive(한변의길이, 몇각형인지, 몇개를 그릴건지)
이런 식의 장미꽃 비슷한 모양이 나오네요!
눈꽃 그려보기
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_snow_recursive(200, 6, 0.4, 3)
draw_snow_recursive(한변의길이, 다리몇개로할건지, 줄어들크기%, 반복할횟수)
여기서 scale은 0~1사이의 값으로 줘야해요! 0.4~0.6정도가 적당한거 같드라구요
이러면 이쁜 눈송이가 완성되는걸 볼 수 있습니다.
일정 각도씩 틀어지며 그려지는 도형 그려보기
myturtle = Myturtle(turtle, 2, -135)
myturtle.draw_repeat(200, 0.8, 120, 10, myturtle.draw_square)
draw_repeat(한변의길이, 줄어들크기%, 총기울어질각도, 몇번 그릴건지, 어떤 도형을 그릴건지)
여기서 myturtle.draw_square이 마지막 인자에 써진것을 볼 수 있는데요.
파이썬은 함수를 변수처럼 사용 할 수가 있습니다.
위 코드는 myturtle에 있는 draw_square메소드를 이용해 반복적으로 사각형을 그리게 될것입니다.
도형에 색깔 채우기
myturtle = Myturtle(turtle, 10, -135)
myturtle.fill_color_start("#0000ff") # RGB값 써주기
myturtle.draw_star(100)
myturtle.fill_color_end()
이런식으로 RGB값과 fill_color_start, end 메소드를 이용해 그린그림의 색깔을 넣을 수 있습니다.
start를 호출한후 그림을 그리고, end를 호출해 색칠을 마쳐주시면 됩니다.
이런식으로 색깔이 들어가는걸 알수있습니다.
마지막으로 한 예제를 통해서 만들어둔 객체를 어떻게 활용할지 알아보겠습니다.
이러한 그림을 그린다고 했을때
import turtle
turtle.shape('turtle')
def draw_rectangle(size):
for i in range(4):
turtle.forward(size)
turtle.right(90)
def four_rectangle(size):
for i in range(4):
draw_rectangle(size)
turtle.right(90)
turtle.speed(10)
turtle.setheading(-180)
four_rectangle(100)
turtle.right(45)
four_rectangle(100)
turtle.mainloop()
위와 같은 방식으로 코드를 짜게 될텐데 저희 소스를 사용하면 초기세팅 부분과, 사각형을 그리는 부분은 따로 구현하지 않아도 쉽게 그릴 수 있습니다.
def four_square(size, myturtle):
for i in range(4):
myturtle.draw_square(size)
turtle.right(90)
myturtle = Myturtle(turtle, 10, -180)
four_square(100, myturtle)
turtle.right(45)
four_square(100, myturtle)
구현 해야할 코드가 엄청 짧아졌죠?
모든설명은 마쳤습니다. 많은 도움 되시길 바랍니다.
'Python' 카테고리의 다른 글
파이썬 regex 정규표현식으로 match된 부분 while문으로 하나씩 변경하기 (0) | 2021.05.25 |
---|---|
pymysql 특수문자 이모티콘 에러 발생 해결법 (0) | 2021.05.18 |
numpy 정리 (0) | 2021.03.12 |
주피터 노트북(jupyter notebook) pdf 변환 (0) | 2021.03.04 |
파이썬 특정 시간이 지난 후 함수 종료하기 (0) | 2021.03.04 |