반응형

 

Unsplash.com

 
앵무조개나 솔방울, 해바라기 씨앗 배열 모양 등에서
발견되는 피보나치 나선을 그려보려고 한다.
파이썬(python) 터틀(turtle)을 이용해
피보나치 수(Fibonacci numbers)를 반지름으로 하는
1/4원을 이어 그리는 것이다.
 
피보나치 수는 첫째와 둘째 항이 1이고,
그 뒤로 바로 앞 두 항의 합이 이어지는 수열이다.
1, 1, 2, 3, 5, 8, 13, 21, 34,... 이런 식이다.
 
피보나치 수는 기원전 5세기 인도의 수학자 핑갈라가 쓴 책에 처음 나온다는데 
유럽에서 레오나르도 피보나치가
새로 태어난 토끼 한 쌍이 자라나
두 달 이상이 되면서 번식하여 매달 새끼 한 쌍을 낳을 때 
토끼 수가 어떻게 증가하는지 이야기하면서 언급해
피보나치 수가 되었다니, 핑갈리는 억울하겠다.
 
피보나치 수의 일반항을 계산하는 공식을 검색했다.
 

출처: 위키백과

 
네이버 계산기로 루트 5의 값을 구하니 2.2360679775이다.
 

네이버 계산기 화면 갈무리

 
 
이제 간단히 코딩해 보자.
 
파이썬 터틀 그래픽(Turtle Graphics)을 이용하기 위해
turtle 모듈을 불러온다.
 

from turtle import *

 
선색은 무지개의 일곱 가지 색으로 하고
차례대로 불러서 사용하기 위해
색깔을 모아놓은 리스트를 만든다.
 
리스트는  
리스트 이름 = [항 1, 항 2, 항 3,...] 형식으로 만들면 되므로
색깔을 모아 놓은 리스트의 이름을 color라고 하고,
red, orange, yellow, green, blue, indigo, violet을 항으로 한다.
 

color = [ 'red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']

 
리스트의 각 항은 
리스트 이름[항 번호]을 이용해 불러올 수 있고
첫 번째 항은 0에서 시작하므로
빨간색은 color [0]이 된다.
 
반복해서 사용하기 위해 항 번호를 저장할 변수를 c라 하면
color [c] 형식이 된다.
 
색이 7가지만 있으므로
c값이 7보다 작을 때만 1씩 더하고
그렇지 않으면 다시 0을 저장하게 if문을 작성한다.
 

if(c<7):  
        c = c + 1
    else:
        c = 0

 
 
변수 rt5를 만들어 루트 5의 값을 저장하면
n번째 피보나치 수 a를 구하는 코드는
위의 공식을 이용해 작성할 수 있다.

rt5 = 2.2360679775
a = 1/rt5 * ( ( (1+rt5)/2)**n  -  ( (1-rt5)/2 )**n   )

 
 
터틀그래픽에서 펜의 색은
pencolor(색깔)로 지정하고,
원을 그리는 명령어는
circle(반지름, 회전각도) 이므로
피보나치 수 a를 반지름으로 하는 1/4 원을 그리는 코드는
 

circle(a, -90)

 
원이 너무 커지지 않게
14번째 피보나치 수까지만 그리고
그림을 다 그린 다음
거북이 모양의 펜이 가려지게
hideturtle() 명령을 사용하여 코드를 완성하였다.
 

from turtle import *

color = [ 'red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
c = 0

for n in range(1, 14): 
    rt5 = 2.2360679775  # 피보나치 수 계산 
    a = 1/rt5 * ( ( (1+rt5)/2)**n  -  ( (1-rt5)/2 )**n   )

    if(c<7):  # 선 색을 차례로 선정
        pencolor(color[c])
        c = c + 1
    else:
        c = 0
        pencolor(color[c])

    circle(a, -90)

hideturtle() # turtle을 숨김
done()

 
 

피보나치 나선

 
터틀그래픽에서 색을 채우는 명령어
fillcolor(색깔)와
채우기를 시작하는 명령어
begin_fill()
채우기를 마치게 하는 명령어
end_fill()을 사용하여 조금 변형해 봅니다.
 

from turtle import *

color = [ 'red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
c = 0

for n in range(1, 14): 
    rt5 = 2.2360679775  # 피보나치 수 계산 
    a = 1/rt5 * ( ( (1+rt5)/2)**n  -  ( (1-rt5)/2 )**n   )

    if(c<7):  # 선 색을 차례로 선정
        fillcolor(color[c])
        begin_fill()
        pencolor(color[c])
        c = c + 1
    else:
        c = 0
        pencolor(color[c])

    circle(a, -90)
    end_fill()

hideturtle() # turtle을 숨김
done()

 
 

 
 

728x90

+ Recent posts