입문 · 황금각

1강: 배열과 각도

Python으로 “황금각” 패턴을 만들면서 배워요:

  • np.arange로 만드는 numpy 배열
  • 배열 전체에 한 번에 하는 계산
  • 라디안, np.cos와 np.sin
  • 각도와 거리에서 x와 y로
  • 값에 따라 색을 칠한 산점도

먼저 보기

클릭하면 YouTube에서 재생돼요.

golden-angle.py
"""Golden angle: seed n at the angle n x 137.5 degrees and the distance sqrt(n) (Vogel, 1979).
Run: python golden-angle.py   (needs: pip install numpy matplotlib)
"""
import numpy as np
import matplotlib.pyplot as plt

plt.style.use("dark_background")

n = np.arange(1, 1001)  # seed numbers
golden = np.pi * (3 - np.sqrt(5))  # 137.5 degrees in radians: 360 / phi**2
theta, r = n * golden, np.sqrt(n)  # the whole rule

x, y = r * np.cos(theta), r * np.sin(theta)
plt.figure(figsize=(6, 6))
plt.scatter(x, y, s=8, c=n, cmap="viridis")
plt.axis("equal")
plt.axis("off")
plt.show()

# Try: golden = np.radians(144) -> five straight spokes (144 degrees is 2/5 of a turn)

이 컴퓨터에 Python이 없나요? 노트북으로 같은 스크립트와 연습 문제, 정답을 브라우저의 Google Colab에서 실행할 수 있어요. 노트북은 영어로 되어 있어요.

한 줄씩

  1. n = np.arange(1, 1001)

    1부터 1000까지의 수를 담은 배열로, 씨앗 하나에 수 하나예요. np.arange는 끝값 바로 앞에서 멈추므로 1001을 주면 1000까지 나와요.

  2. golden = np.pi * (3 - np.sqrt(5))

    라디안으로 나타낸 황금각이에요. 라디안은 numpy의 삼각함수가 쓰는 단위로, 한 바퀴가 2π예요. π·(3 − √5) ≈ 2.39996라디안, 곧 137.5°예요.

  3. theta, r = n * golden, np.sqrt(n)

    배열에 하는 계산은 모든 원소에 적용돼요. n * golden은 각도 1000개를 한 번에, np.sqrt(n)은 거리 1000개를 만들어요. 반복문이 필요 없어요.

  4. x, y = r * np.cos(theta), r * np.sin(theta)

    각도와 거리(극좌표)에서 종이 위의 점으로: x = r·cos θ, y = r·sin θ.

  5. plt.scatter(x, y, s=8, c=n, cmap="viridis")

    씨앗마다 점 하나, 크기 8, 각 점은 번호 n에 따라 ‘viridis’ 컬러맵에서 색을 받아요.

  6. plt.axis("equal")

    두 축의 눈금을 같게 해서 꽃이 찌그러지지 않고 둥글게 나와요.

직접 해 보기

  1. 황금각을 도 단위로 출력해 보세요.

    힌트

    np.degrees는 라디안을 도로 바꿔요.

    정답

    print(np.degrees(golden))은 137.50776405003785를 출력해요.

  2. 처음 100개의 씨앗만 그려 보세요.

    힌트

    np.arange의 끝값을 바꾸세요.

    정답

    n = np.arange(1, 101). 씨앗이 100개뿐이면 나선 무리가 훨씬 보기 어려워요. 이 패턴에는 씨앗이 많이 필요해요.

  3. 바깥쪽 씨앗을 안쪽 씨앗보다 크게 만들어 보세요.

    힌트

    크기인 s도 배열이 될 수 있어요.

    정답

    plt.scatter(x, y, s=n / 50, c=n, cmap="viridis"): 씨앗 1000은 크기 20, 씨앗 50은 크기 1이 돼요.

퀴즈

1. np.arange(1, 1001)에는 무엇이 들어 있을까요?
2. 스크립트에 for 반복문이 없는 이유는 무엇일까요?
3. np.cos와 np.sin은 각도를 어떤 단위로 받을까요?
4. 각도 θ와 거리 r을 점으로 바꾸는 것은 무엇일까요?
5. golden = np.radians(144)로 하면 무엇이 나올까요?

플래시카드

앞면을 읽고, 뒷면의 내용을 스스로 말해 본 다음 카드를 펼쳐 보세요.

  • np.arange(a, b)

    a부터 b 바로 앞까지(b는 빼고)의 수를 담은 numpy 배열.

  • 벡터화된 코드

    항목마다 도는 반복문 대신 배열 전체에 한 번에 하는 계산: 더 짧고 더 빨라요.

  • 라디안

    np.cos와 np.sin의 각도 단위로, 한 바퀴가 2π예요. np.radians(144)는 도에서 변환해요.

  • 극좌표에서 x, y로

    x = r·cos θ, y = r·sin θ.

  • plt.scatter(x, y, c=values)

    점마다 점 하나. c는 컬러맵 cmap을 거쳐 값에 따라 각 점에 색을 칠해요.

이 플래시카드만 따로 보기 →