Nếu bạn giống tôi, bạn cố gắng trở thành một lập trình viên cẩn thận. Vì vậy, nó làm cho bạn lo lắng khi bạn thấy mã ngẫu nhiên rải rác trên internet mà purports để giải quyết một vấn đề thiên văn phức tạp, nhưng không giải thích tại sao giải pháp là chính xác.
Bạn tin rằng phải có các nguồn có thẩm quyền như sách chứa các giải pháp cẩn thận và đầy đủ. Ví dụ:
Meeus, Jean. Thuật toán thiên văn. Richmond: Willmann-Bell, 1991. ISBN 0-943396-35-2.
Duffett-Smith, Peter. Thực tế Thiên văn học với máy tính của bạn. Ed thứ 3 Cambridge: Nhà in Đại học Cambridge, 1981. ISBN 0-521-28411-2.
Bạn đặt niềm tin của mình vào các thư viện nguồn mở được kiểm tra rộng rãi, được kiểm tra rộng rãi, có thể sửa lỗi (không giống như các trang web tĩnh). Sau đó, là giải pháp Python cho câu hỏi của bạn dựa trên thư viện PyEphem, sử dụng giao diện Phases of the Moon.
#!/usr/bin/python
import datetime
import ephem
def get_phase_on_day(year,month,day):
"""Returns a floating-point number from 0-1. where 0=new, 0.5=full, 1=new"""
#Ephem stores its date numbers as floating points, which the following uses
#to conveniently extract the percent time between one new moon and the next
#This corresponds (somewhat roughly) to the phase of the moon.
#Use Year, Month, Day as arguments
date=ephem.Date(datetime.date(year,month,day))
nnm = ephem.next_new_moon (date)
pnm = ephem.previous_new_moon(date)
lunation=(date-pnm)/(nnm-pnm)
#Note that there is a ephem.Moon().phase() command, but this returns the
#percentage of the moon which is illuminated. This is not really what we want.
return lunation
def get_moons_in_year(year):
"""Returns a list of the full and new moons in a year. The list contains tuples
of either the form (DATE,'full') or the form (DATE,'new')"""
moons=[]
date=ephem.Date(datetime.date(year,01,01))
while date.datetime().year==year:
date=ephem.next_full_moon(date)
moons.append((date,'full'))
date=ephem.Date(datetime.date(year,01,01))
while date.datetime().year==year:
date=ephem.next_new_moon(date)
moons.append((date,'new'))
#Note that previous_first_quarter_moon() and previous_last_quarter_moon()
#are also methods
moons.sort(key=lambda x: x[0])
return moons
print get_phase_on_day(2013,1,1)
print get_moons_in_year(2013)
này trả
0.632652265318
[(2013/1/11 19:43:37, 'new'), (2013/1/27 04:38:22, 'full'), (2013/2/10 07:20:06, 'new'), (2013/2/25 20:26:03, 'full'), (2013/3/11 19:51:00, 'new'), (2013/3/27 09:27:18, 'full'), (2013/4/10 09:35:17, 'new'), (2013/4/25 19:57:06, 'full'), (2013/5/10 00:28:22, 'new'), (2013/5/25 04:24:55, 'full'), (2013/6/8 15:56:19, 'new'), (2013/6/23 11:32:15, 'full'), (2013/7/8 07:14:16, 'new'), (2013/7/22 18:15:31, 'full'), (2013/8/6 21:50:40, 'new'), (2013/8/21 01:44:35, 'full'), (2013/9/5 11:36:07, 'new'), (2013/9/19 11:12:49, 'full'), (2013/10/5 00:34:31, 'new'), (2013/10/18 23:37:39, 'full'), (2013/11/3 12:49:57, 'new'), (2013/11/17 15:15:44, 'full'), (2013/12/3 00:22:22, 'new'), (2013/12/17 09:28:05, 'full'), (2014/1/1 11:14:10, 'new'), (2014/1/16 04:52:10, 'full')]
Vấn đề tương tự là ở đây các chùm lần ẩn trong vấn đề xác định ngày lễ Phục Sinh, Lint, Thứ Sáu Tuần Thánh, và/hoặc lễ Vượt Qua. – nategoose
Một mô hình thiên văn chính xác là không thể tránh khỏi phức tạp; tính toán cho trăng tròn mà từ đó ngày lễ Phục Sinh được bắt nguồn (xem http://en.wikipedia.org/wiki/Paschal_full_moon) sử dụng một mô hình đơn giản. –
Sử dụng tuyệt vời cho moon.py được trích dẫn trong câu trả lời đã chọn là viết một ứng dụng GUI (tôi sẽ đi với GTK) để hiển thị giai đoạn mặt trăng với hình ảnh mặt trăng (thực ra tôi đang cố gắng làm điều này, trở nên dễ dàng hơn với câu hỏi này và câu trả lời của nó ...) – heltonbiker