M42/docs: view doc:56/v6

JS로 특정 시간의 달의 위상을 계산하기 위한 연구

v1Ossia
v2Ossia
v3Ossia
v4Ossia
v5Ossia
v6Ossia
요약

JS로 특정 시간의 달의 위상을 계산하기 위한 연구입니다.

평균 삭망월(synodic month)이 29.530587981일이고 미 해군에 따르면 2019-09-28 18:26+00에 0%인 것 같으므로, 달이 등속 원운동을 한다고 가정하였을 때

k = ((new Date() - new Date('2019-09-28T18:26Z')) / (24 * 60 * 60 * 1000)) % 29.530587981 / 29.530587981

이라 하면 0과 1 사이의 값이 나오며 0이 그믐달, 0.25가 상현달, 0.5가 보름달, 0.75가 하현달이 된다. 즉 2πk2\pi k가 북반구에서 보았을 때 지구로부터 태양으로 뻗어 가는 반직선을 기준으로 달의 각도를 반시계 방향으로 잰 것이다. 지구와 태양 간의 거리 약 150000000km150\,000\,000\,\mathrm{km}가 지구와 달 간의 거리 약 400000km400\,000\,\mathrm{km}에 비해 충분히 크므로 지구에서 봤을 때 달의 밝은 영역의 각도 θ\theta를 다음과 같이 어림할 수 있다. 대충 1°1\degree 정도 차이가 날 수 있다.

θ={2πkif k<1/2,2π(1k)otherwise.\theta = \begin{cases} 2\pi k &\text{if } k <1/2, \\ 2\pi(1-k) &\text{otherwise.} \end{cases}

밝은 영역은 북반구에서 보았을 때 오른쪽부터 차오르며 보름달이 된 후 오른쪽부터 줄어든다. 이때 지구에서 본 달을 평면에 사영시켰을 때 밝은 영역이 사영된 면적의 비율 rr은 다음과 같을 것이다.

r=1cosθ2.r = \frac{1-\cos\theta}2.

k,θ,rk,\theta,r을 모두 구하는 코드는 다음과 같다.

var k = ((new Date() - new Date('2019-09-28T18:26Z')) / (24 * 60 * 60 * 1000)) % 29.530587981 / 29.530587981,
	theta = 2 * Math.PI * (k < 1/2 ? k : 1 - k),
	r = (1 - Math.cos(theta)) / 2;

이때 달의 생김새를 그리는 코드는 대강 다음과 같다.

var isWaxing = k < 1/2,
	cos_theta = Math.cos(theta),
	abs_cos_theta = Math.abs(cos_theta),
	step_cos_theta = cos_theta > 0 ? 1 : 0;

var [a, b, c, d] = [
	isWaxing ? 1 : abs_cos_theta,
	isWaxing ? 1 : 1 - step_cos_theta,
	!isWaxing ? 1 : abs_cos_theta,
	!isWaxing ? 1 : 1 - step_cos_theta
];

var svg = `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12 0 A${a} 1 0 0 ${b} 12 24 A${c} 1 0 0 ${d} 12 0Z" fill="#90A4AE"/></svg>`;