터틀 모듈을 이용한 그래픽 소과제를 진행 해보았다.
코드는 import 나 객체 선언 외 로직적인 부분만 작성했다. (전체 코드는 Git에 있음)
문서는 https://docs.python.org/3/library/turtle.html 참조
로직
- turtle 이용해서 정사각형 그리기
- 한 변의 길이가 100이고, 화면 어느 지점에 그리던 상관 없다.
- 점선 그리기
- 선 그리기 , 안 그리고 걸어가기를 15회 반복하기
- turtle의 걸어가는 길이는 10으로 고정
- 정삼각형, 정사각형, 정오각형, 정육각형, 정칠각형, 정팔각형, 정구각형, 정십각형 그리기
- 한 변의 길이는 100으로 고정
- 한 도형을 그리고 색상을 바꿔준다.
- 무작위로 가는 길을 그리기
- 동쪽, 서쪽, 남쪽, 북쪽을 무작위로 움직이기
- 펜 사이즈는 15로 고정
- spirograph 그리기
- 반지름이 100인 원을 그리기
- 허스트 페인팅 프로젝트 이미지에서 RGB 값 추출하기
- colorgram 모듈을 이용하여 이미지에서 30개의 색상 추출
- 6에서 추출한 RGB 값으로 허스트 페인팅 그림 그리기
- 가로 10줄 세로 10줄의 점을 찍기
- 각 점은 크기가 20으로 고정, 점들 간의 간격은 약 50
코드
1. turtle 이용해서 정사각형 그리기
for i in range(4):
tim.forward(100)
tim.left(90)
for문을 이용해 한 변을 그리고 각도를 90도 이동시켜 다시 반복하게끔 만들어 정사각형을 만들었다.
2. 점선 그리기
for i in range(15):
tim.pendown()
tim.forward(10)
tim.penup()
tim.forward(10)
penup 과 pendown 메소드를 이용하여 10 걸음씩 이동해 점선을 그리는 것 처럼 했다.
3. 정삼각형, 정사각형, 정오각형, 정육각형, 정칠각형, 정팔각형, 정구각형, 정십각형 그리기
color = ["red",
"royal blue",
"black",
"dark green",
"pink",
"indigo",
"cyan"]
for i in range(3, 10):
# 외각을 구하는 방법은 360에서 변의 개수를 나눈다
angle = 360 / i
for j in range(i):
tim.forward(100)
tim.right(angle)
tim.color(random.choice(color))
처음엔 어렵게 생각해서 각도를 지정해주는 과정이 생각이 안났는데, 강의에서 안내해주어 다행이었다.
저렇게 그리려면 외각의 각도를 알아야 하는 데 외각을 구하는 방법은 360도 에서 변의 개수를 나누면 된다고 한다.
그래서 for 반복문으로 3각형 ~ 10각형 까지 그리도록 하고 그 안에서 또 for문을 실행해 각도를 변하게 하였다.
4. 무작위로 가는 길을 그리기
color = ["red",
"royal blue",
"black",
"dark green",
"pink",
"indigo",
]
angle = [
0,
90,
180,
270
]
tim.pensize(15)
tim.speed('fast')
while True:
tim.forward(30)
tim.seth(random.choice(angle))
tim.color(random.choice(color))
이런 식으로 무작위로 색상을 바꾸고 그림을 그리게된다.
color 는 원하는 색상, 각도는 동서남북으로 고정이니 리스트를 만들어 랜덤으로 추출하게끔 만들었다.
그리고 while 문으로 반복하게끔 했다.
5. spirograph 그리기
def random_color():
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
color_tuple = (r, g, b)
return color_tuple
tim.speed('fastest')
screen = Screen()
for angle in range(0, 360, 2):
screen.colormode(255)
tim.color(random_color())
tim.circle(100)
tim.home()
tim.left(angle)
screen.exitonclick()
이런 식으로 그림을 그리는 걸 spirograph라고 하나보다. 처음 접해서 신기했다.
랜덤으로 color tuple 을 뽑아내는 함수를 생성해 return 값으로 랜덤 튜플을 반환 받았다. (23, 223, 187) 이런식의 데이터로 반환된다.
그리고 360도를 돌아가며 원을 그리면 되기 때문에 for 반복문의 기준은 각도가 되고 range 함수를 통해서 0에서 360 까지 2의 간격을 둔 숫자로 반복 되게끔 했다.
turtle 을 home 으로 보내지 않으면 원위치에서 그리지 않고 이동하여 home 메소드도 실행 해 주었다.
6. 허스트 페인팅 프로젝트 이미지에서 RGB 값 추출하기
import colorgram
colors = colorgram.extract("spot_painting.png", 30)
extract_color = []
for i in colors:
choice_r = i.rgb.r
choice_g = i.rgb.g
choice_b = i.rgb.b
tuple_color = (choice_r, choice_g, choice_b)
extract_color.append(tuple_color)
print(extract_color)
이런 리스트가 반환되게 된다.
저 컬러그램 모듈이 반환하는 Object 배치가 조금 신기하게 되어 있어서 반복 과정을 거쳐 추출하고 append 를 통해 리스트에 넣어 주었다.
7. 6에서 추출한 RGB 값으로 허스트 페인팅 그림 그리기
from turtle import Turtle, Screen
import random
tim = Turtle()
screen = Screen()
screen.colormode(255)
screen.screensize(1080,2000)
tim.penup()
tim.ht()
tim.speed('fastest')
# 과제 2
# 가로 10줄 세로 10줄의 점을 찍어야한다.
# 각 점은 크기가 약 20 점들 간의 간격은 약 50
color_list = [(247, 249, 248), (248, 246, 245), (235, 216, 91), (232, 240, 244), (41, 108, 151), (245, 220, 232), (117, 222, 237), (243, 132, 48), (217, 124, 190), (112, 197, 119), (244, 79, 43), (229, 46, 86), (16, 173, 200), (154, 29, 33), (136, 157, 210), (169, 42, 97), (248, 164, 213), (136, 68, 51), (14, 179, 96), (79, 113, 204), (74, 41, 35), (0, 117, 73), (49, 44, 59), (19, 65, 154), (113, 224, 211), (126, 37, 35), (234, 171, 161), (46, 125, 92), (21, 85, 103), (173, 182, 220)]
def get_color():
return color_list[random.randint(0, len(color_list)-1)]
for i in range(0,100):
tim.dot(20, get_color())
tim.forward(50)
print(tim.position())
for j in range(0,10):
if tim.position() == (float(500), float(j*50)):
tim.home()
tim.sety(float((j+1)*50))
screen.exitonclick()
강의를 보니 나와는 조금 다른 방식으로 코딩을 한거 같던데 초기에 canvas 사이즈가 작아 나는 screen size를 조정하는 메소드를 이용 했는데 강사님은 아예 초기 위치를 변경하여 그 위치부터 그리는 방식을 택했다.
그리고 강사님은 dot의 개수만큼 반복문을 실행시키고, if 문을 걸어서 dot_count가 10으로 나눴을 때 나머지가 0인 경우 처음 시작된 점의 바로 위에 점이 위치할 수 있게끔 로직을 수행했다. (캡쳐가 안돼서 보여줄수가 없을듯...)
3줄 요약
얼추 이제 파이썬에 대한 이해가 잘 되고 있다. 문제가 나와도 여차저차 잘 해결하는 것 같긴한데 좀 더 명확하고 클린코드처럼 만들 순 없을까하는 생각이 들긴 한다. 7번 문제 해결하면서 i를 나눠서 나머지가 10인 경우가 이중 for문을 실행하는 것보다 더 깔끔하고 메모리 낭비도 없어보인다.
'프로그래밍 > Python' 카테고리의 다른 글
Python 부트 캠프 - turtle 모듈을 이용한 퐁게임 만들기 (0) | 2023.06.07 |
---|---|
Python 부트 캠프 - turtle 모듈을 이용한 레이싱 경기 (0) | 2023.05.24 |
Python 부트 캠프 - OOP를 이용한 퀴즈 생성기 (0) | 2023.05.23 |
Python 부트 캠프 - OOP를 이용한 커피 머신 생성 (0) | 2023.05.21 |
Python 부트 캠프 - 커피 머신 생성 (2) | 2023.05.19 |