데이터 분석가

파이썬(Python) 스피로 그래프 & Spot painting 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 스피로 그래프 & Spot painting

PlintAn 2023. 3. 28. 10:00

이 거북이는 무료로 그림을 그립니다 !

 

안녕하세요  !!

 

이번 시간에는 거북이가 자유롭게 돌아다니면서 그림을 그립니다 !

 

그냥 거북이가 아니라 해적거북이인듯

 

첫 번째 거북이 그림

import turtle as t #turtle을 t로 명명합니다
import random

tim = t.Turtle() #이 거북이 이름은 tim입니다

colours = ["CornflowerBlue", "DarkOrchid", "IndianRed", "DeepSkyBlue", "LightSeaGreen", "wheat", "SlateGray", "SeaGreen"]
directions = [0, 90, 180, 270] #directions은 90도씩 4가지 방향이 있습니다
tim.pensize(15) #거북이의 펜 사이즈는 15포인트입니다
tim.speed("fastest") #거북이의 속도는 "아주빠름"

for _ in range(200): #200번 반복
    tim.color(random.choice(colours)) #첫번째 컬러선택
    tim.forward(30) #30칸을 갑니다
    tim.setheading(random.choice(directions)) #[0, 90, 180, 270] 중 한 가지 방향

이 거북이 이름은 tim 입니다 

 

방향을 정해주고 이를 바탕으로 [0, 90, 180, 270] 도 중 랜덤 선택이 되고

 

forward(30) 30칸씩 앞으로 나아갑니다

 

끝 !

 

 

 

두 번째 스피로 그래프(spirograph)

SpiroGraph(스피로 그래프)

import turtle as t #t로 명명
import random

tim = t.Turtle()
t.colormode(255) #rgb는 1~255 숫자 중 선택
def random_color(): #랜덤 색을 받습니다rgb는 3가지 색 조합임
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    color = (r, g, b)
    return color #랜덤 color 반환

def draw_spirograph(size_of_gap):
    for _ in range(int(360 / size_of_gap)):
        tim.color(random_color())
        tim.circle(100) #100은 원을 의미한다
        tim.setheading(tim.heading() + size_of_gap)

draw_spirograph(5)

rgb 각각 요소들의 값들을 랜덤으로 받아 조합하여 랜덤 색을 정합니다.

 

size_of_gap = 5부터 

 

 

heading은 현재 거북이가 바라보는 방향의 각도를 반환합니다

 

 

 

 

 

 

허스트의 spot painting은 30종류의 색을 이용해 100개의 점을 만든 작품입니다

 

이번에는 30종류의 색을 추출하기 위해 colorgram을 다운하여 추출해봅시다

 

https://pypi.org/project/colorgram.py/

 

colorgram.py

A Python module for extracting colors from images. Get a palette of any picture!

pypi.org

 

SpotPainting

세 번째 그림은 어디서 많이 본 것 같은 그림이지 않나요 ??

 

사실 제가 파이썬 프로그램으로 그린 그림인데요 !

 

물론 원작자는 데미안 허스트 spot painting 입니다만 30개의 점은 랜덤으로 표시 돼 있으므로

 

아주 똑같진 않을 않습니다

 

import turtle as turtle_module #
import random

turtle_module.colormode(255) 
tim = turtle_module.Turtle()
tim.speed("fastest")
tim.penup() #펜 이동 중 펜을 올려서 표시 안되게함
tim.hideturtle() #커서를 숨깁니다

color_list = [(202, 164, 109), (238, 240, 245), 
(150, 75, 49), (223, 201, 135), (52, 93, 124), 
(172, 154, 40), (140, 30, 19), (133, 163, 185), 
(198, 91, 71), (46, 122, 86), (72, 43, 35), 
(145, 178, 148), (13, 99, 71), (233, 175, 164), 
(161, 142, 158), (105, 74, 77), (55, 46, 50), 
(183, 205, 171), (36, 60, 74), (18, 86, 90), 
(81, 148, 129), (148, 17, 20), (14, 70, 64), 
(30, 68, 100), (107, 127, 153), (174, 94, 97), 
(176, 192, 209)]

바로 코드를 살펴 보겠습니다 !

 

turtle을 turtle_module로 이름을 바꿔 불러왔습니다

 

***rgb 색상을 기준으로 하므로 colormode(255)로 설정합니다

 

speed로 그림 그리는 속도 설정, penup으로 공백을 만들고 커서를 숨깁니다

 

그리고 컬러는 30종류로 , 데미안 허스트가 사용한 구색과 같은 구색입니다 !

 

tim.setheading(225) #225도로 각도
tim.forward(300) #300만큼 앞으로
tim.setheading(0) #0도로 각도 변경
number_of_dots = 100 # 점 개수

for dot_count in range(1, number_of_dots + 1): #100사이즈
    tim.dot(20, random.choice(color_list)) #점의 크기 20, 컬러는 랜덤
    tim.forward(50) #50앞으로

    if dot_count % 10 == 0: #한 행에 10개씩만 입력되고 10개가 될 때 줄 바꿈
        tim.setheading(90)
        tim.forward(50)
        tim.setheading(180)
        tim.forward(500)
        tim.setheading(0)


screen = turtle_module.Screen() #별도의 스크린을 불러옵니다
screen.exitonclick() #스크린을 클릭 시  종료됩니다

setheading은 각도를 조정합니다 (0도 ~ 360도)

forward는 이동 거리를 조정합니다

 

def dot_count in range(1, number_of_dots +1): 을 통해 100개의 반복문을 작성합니다

 

dot(크기, 색깔)로 20크기 컬러 랜덤.

 

이중 if문을 이용해 한 행에 10줄만 점이 찍히고 다음 줄로 올라갑니다

 

그렇게 10 x 10 로 100개의 점이 찍히면서 완료됩니다.

 

 

 

 

 

Comments