코흐 곡선의 넓이가 수렴하는 것 확인하기
코흐 곡선은 선분 하나를 셋으로 나눈 뒤 가운데를 삼각형 두 변으로 바꾸는 걸 반복해서 만든다. 재귀 규칙이 그대로 코드가 된다.
def koch(n, length):
if n == 0:
t.fd(length)
return
koch(n-1, length/3)
t.left(60)
koch(n-1, length/3)
t.right(120)
koch(n-1, length/3)
t.left(60)
koch(n-1, length/3)
길이 length 짜리 선분 하나가 길이 length/3 짜리 넷으로 바뀐다. 사이에 +60, -120, +60 만큼 방향을 튼다. 각도를 다 더하면 0이라 시작 방향과 끝 방향이 같다. 그래서 재귀로 들어갔다 나와도 방향이 어긋나지 않는다.
n == 0 이면 그냥 그린다. 재귀를 몇 단계까지 내려갈지가 곡선의 세밀함이 된다.
길이는 발산한다
한 단계 지나면 길이가 4/3배가 된다. 셋으로 나눠서 넷으로 만드니까 그렇다. 1보다 큰 수를 계속 곱하므로 단계를 늘릴수록 길이는 한없이 커진다.
그런데 그림은 화면 안에 그대로 있다. 길이는 발산하는데 차지하는 넓이는 안 커진다는 게 이상해서 넓이를 직접 계산해봤다.
넓이 계산
각 단계에서 새로 붙는 건 정삼각형이다. 몇 개가 붙는지와 한 변이 얼마인지만 알면 된다.
import math
size = 10
n = 100
area = [0] * (n + 1)
for i in range(1, n + 1):
n_i = 1 * 4**(i-1)
s_i = size * (1/3)**i
area[i] = area[i - 1] + n_i * 0.5 * s_i**2 * math.sin(math.pi/3)
i 단계에서 붙는 삼각형은 4의 (i-1)제곱개다. 선분이 매 단계 4배로 늘어나기 때문이다. 한 변은 size * (1/3)^i 다.
정삼각형 넓이를 0.5 * s² * sin(60°) 로 구했다. 두 변과 낀 각으로 구하는 식을 그대로 쓴 것이다.
area 를 누적 배열로 두면 각 단계까지의 합이 그대로 남는다.
결과
1단계: 4.8113
2단계: 6.9496
3단계: 7.9000
4단계: 8.3223
5단계: 8.5101
...
100단계: 8.660254037844380
붙는 넓이가 매 단계 4/9배로 줄어든다. 개수는 4배가 되는데 넓이는 한 변이 1/3이라 1/9배가 되기 때문이다. 4/9는 1보다 작으므로 등비급수가 수렴한다.
size = 10 일 때 5√3인 8.660254...로 수렴한다. 100단계 값이 소수점 15자리까지 맞는다.
길이의 비가 4/3이고 넓이의 비가 4/9라는 게 전부다. 같은 도형인데 재는 대상에 따라 하나는 발산하고 하나는 수렴한다.