화면의 별 하나하나가 나머지 전부의 중력을 느낍니다. 정직하게 계산하면 매 프레임 2,500만 번의 만유인력 계산이 필요하지만, 이 페이지는 우주를 사분면으로 쪼개 멀리 있는 별 무리를 질량중심 하나로 뭉뚱그리는 Barnes·Hut 트리로 수십만 번에 끝냅니다. 은하 두 개를 충돌시켜 보세요. 조석 꼬리가 뽑혀 나옵니다. 안테나 은하가 그렇게 생겼습니다.
노란 별 하나가 나머지 전부의 힘을 구할 때, 초록 칸은 그 안의 별들을 질량중심 하나로 뭉쳐 셈한 곳입니다. 가까운 곳만 낱낱이 내려갑니다. 숫자는 이 400개 예시에서 실제로 센 것입니다.
별 5,000개의 전수 계산은 매 프레임 2,500만 회. 우주를 사분면으로 재귀 분할하고, 멀리 있는 셀은 그 안의 별 전부를 질량중심 하나로 칩니다. 정확도 θ 하나로 손실을 제어합니다.
if (셀크기/거리 < θ) 질량중심 하나로 계산 // 근사 else 네 자식 셀로 내려간다
오일러 적분은 궤도가 조금씩 부풀다 터집니다. leapfrog는 시간 대칭이라 에너지 오차가 누적되지 않고 진동만 합니다. 행성 궤도를 수만 년 돌리는 천문학 코드가 전부 이 계열입니다.
v += a·dt/2 // kick x += v·dt // drift a = 힘(x)/m v += a·dt/2 // kick
은하가 흩어지지 않는 건 각 별이 자기 반지름 안쪽 질량에 맞는 속도로 공전하기 때문입니다. v = √(GM(r)/r). 이 초기 조건이 틀리면 은하는 몇 바퀴 안에 붕괴하거나 흩어집니다.
M(r) = 중심핵 + 안쪽 원반 질량
v_circ = sqrt(G·M(r)/r)
// 접선 방향으로 발사
은하가 스쳐 지나면 가까운 쪽 별은 세게, 먼 쪽 별은 약하게 당겨집니다. 이 힘의 차이가 별들을 긴 리본으로 뽑아냅니다. 규칙을 넣은 게 아니라 만유인력 하나에서 저절로 나오는 형태입니다.
// 코드에 "꼬리" 없음.
// F = Gm₁m₂/r² 하나가
// 안테나 은하를 그린다
위 판은 별을 평면에 놓고 풉니다. 실제 은하는 입체이고, 같은 힘 법칙이 세 방향으로 작용합니다. 아래는 같은 규칙(거리 제곱에 반비례)을 3차원에서 매 프레임 적분한 것입니다.
이 판이 미리 넣어 둔 궤도를 재생하는 것이 아닙니다. 매 프레임 가속도를 구해 속도와 위치를 갱신합니다. 그래서 새로 고칠 때마다 조금씩 다른 모양이 됩니다.
별 개수는 눈으로 보기 위해 줄였습니다. 위 판의 5,000개는 Barnes-Hut 로 근사해 푸는 것이고, 여기는 직접 계산합니다.
위 화면은 별들이 서로를 당기게 놔둔 계산입니다. 실제로 그 일이 벌어지고 있는 곳을 허블이 찍었습니다.
구상성단 M15입니다. 가운데가 하얗게 뭉쳐 셀 수 없고, 바깥으로 갈수록 성기게 흩어집니다. 푸른 별과 주황 별이 섞여 있고요.
위 화면을 한참 돌려 두면 나오는 모양이 이것입니다 — 아무렇게나 뿌려 놓아도 서로 당기다 보면 가운데가 빽빽해지고 가장자리는 헐거워집니다. 누가 그렇게 배치한 게 아니라 중력만으로 그렇게 됩니다.
그리고 이 사진이 이 판의 계산량 이야기이기도 합니다. 별을 하나하나 짝지어 힘을 다 계산하면 개수의 제곱으로 늘어납니다. 저 성단은 별이 수십만 개입니다 — 전수로는 못 풉니다. 그래서 멀리 있는 무리를 덩어리 하나로 묶어 근사하고, 그 묶는 기준이 위 θ 손잡이입니다.
기준일을 100으로 놓고 그린 선입니다. 통화가 서로 달라 지수로 겹쳤습니다.