Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 그리는 프랙탈 트리: pygame과 turtle 모듈 활용법


프랙탈 패턴은 자연 곳곳에서 쉽게 찾아볼 수 있습니다. 고사리 잎에서 작은 가지 하나를 떼어내 보면 잎 전체와 놀랍도록 닮아 있고, 길가의 자갈 하나가 웅장한 산의 형태를 연상시키기도 합니다. 이처럼 작은 패턴이 반복되어 하나의 큰 패턴을 이루는 구조를 프랙탈(fractal)이라고 하며, 이를 나무 가지 형태로 시각화한 것이 바로 프랙탈 트리입니다.

파이썬에서는 기본으로 제공되거나 설치 가능한 다양한 모듈을 활용해 손쉽게 프랙탈 트리를 그릴 수 있습니다. 이번 글에서는 대표적인 두 가지 방법인 pygameturtle 모듈을 이용한 구현 방법을 살펴보겠습니다.

1. pygame 모듈로 구현하기

pygame은 게임 및 그래픽 개발에 널리 쓰이는 모듈로, 프랙탈 트리를 그리는 데 필요한 선 그리기 함수들을 제공합니다. 구현 순서는 다음과 같습니다.

  1. 먼저 화면(윈도우)의 크기를 정의합니다.
  2. 패턴이 반복될 깊이(deepness)를 지정합니다.
  3. 재귀(recursion)를 통해 동일한 패턴을 설정된 깊이까지 계속 반복해서 그립니다.

여기서 재귀가 핵심 역할을 합니다. 한 번 그린 선의 끝점에서 좌우로 일정한 각도(±25도)만큼 방향을 바꿔 새로운 선을 그리고, 이 과정을 깊이가 소진될 때까지 반복하면 자연스러운 나무 형태가 완성됩니다.

예제 코드

import pygame, math

pygame.init()
screen = pygame.display.set_mode((750, 650))
pygame.display.set_caption("Fractal Tree")
display = pygame.display.get_surface()

def drawTree(a, b, pos, deepness):
    if deepness:
        c = a + int(math.cos(math.radians(pos)) * deepness * 10.0)
        d = b + int(math.sin(math.radians(pos)) * deepness * 10.0)
        pygame.draw.line(display, (127,255,0), (a, b), (c, d), 1)
        drawTree(c, d, pos - 25, deepness - 1)
        drawTree(c, d, pos + 25, deepness - 1)

def process(event):
    if event.type == pygame.QUIT:
        exit(0)

drawTree(370, 650, -90, 10)
pygame.display.flip()
while True:
    process(pygame.event.wait())

실행 결과

위 코드를 실행하면 화면 중앙에서 위로 뻗어나가는 아름다운 프랙탈 트리를 확인할 수 있습니다.

파이썬으로 그리는 프랙탈 트리: pygame과 turtle 모듈 활용법

2. turtle 모듈로 구현하기

파이썬에 기본 포함된 turtle 모듈을 사용하면 더욱 직관적으로 프랙탈 트리를 구현할 수 있습니다. 거북이(turtle)가 그리기 방향만 바꿔가며 나뭇가지를 반복 패턴으로 그려나가는 방식입니다. 함수가 반복될 각도를 정의해두면, 재귀 호출을 통해 완성된 나무 모습을 얻을 수 있습니다.

코드의 동작 원리를 간단히 설명하면 다음과 같습니다.

  • 가지의 길이(Length)가 10보다 클 때만 그리기를 진행합니다(종료 조건).
  • 앞으로 이동한 뒤 오른쪽으로 25도 회전하고, 길이를 15 줄여 재귀 호출합니다.
  • 왼쪽으로 50도 회전해 반대편 가지도 그린 후, 원래 위치로 되돌아옵니다.

예제 코드

import turtle

def tree(Length, n):
    if Length > 10:
        n.forward(Length)
        n.right(25)
        tree(Length-15, n)
        n.left(50)
        tree(Length-15, n)
        n.right(25)
        n.backward(Length)

def function():
    n = turtle.Turtle()
    data = turtle.Screen()
    n.left(90)
    n.up()
    n.backward(100)
    n.down()
    n.color("green")
    tree(85, n)
    data.exitonclick()

function()

실행 결과

위 코드를 실행하면 초록색 선으로 이루어진 균형 잡힌 프랙탈 트리가 화면에 나타납니다. 창을 클릭하면 프로그램이 종료됩니다.

파이썬으로 그리는 프랙탈 트리: pygame과 turtle 모듈 활용법

마무리

프랙탈 트리는 재귀 알고리즘의 동작 원리를 시각적으로 이해하기에 가장 좋은 예제 중 하나입니다. 분기 각도(±25도), 깊이, 길이 감소 폭 등의 매개변수 값을 조절해보면서 다양한 형태의 나무를 만들어 보세요. pygame은 빠른 그래픽 렌더링이 필요할 때, turtle은 학습용 인터랙티브 실습에 적합합니다.