평균 삭망월(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가 하현달이 된다. 즉 가 북반구에서 보았을 때 지구로부터 태양으로 뻗어 가는 반직선을 기준으로 달의 각도를 반시계 방향으로 잰 것이다. 지구와 태양 간의 거리 약 가 지구와 달 간의 거리 약 에 비해 충분히 크므로 지구에서 봤을 때 달의 밝은 영역의 각도 를 다음과 같이 어림할 수 있다. 대충 정도 차이가 날 수 있다.
밝은 영역은 북반구에서 보았을 때 오른쪽부터 차오르며 보름달이 된 후 오른쪽부터 줄어든다. 이때 지구에서 본 달을 평면에 사영시켰을 때 밝은 영역이 사영된 면적의 비율 은 다음과 같을 것이다.
을 모두 구하는 코드는 다음과 같다.
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>`;