Objective c 精确计算月相

Objective c 精确计算月相,objective-c,astronomy,Objective C,Astronomy,对于一个新项目,我喜欢计算月亮的相位。到目前为止,我还没有看到任何这样做的代码。我不想依靠在线服务来实现这一点 我试过一些功能,但它们不是100%可靠。我尝试过的功能: NSInteger r = iYear % 100; r %= 19; if (r>9){ r -= 19;} r = ((r * 11) % 30) + iMonth + iDay; if (iMonth<3){r += 2;} r -= ((iYear<2000)

对于一个新项目,我喜欢计算月亮的相位。到目前为止,我还没有看到任何这样做的代码。我不想依靠在线服务来实现这一点

我试过一些功能,但它们不是100%可靠。我尝试过的功能:

NSInteger r = iYear % 100;

    r %= 19;
    if (r>9){ r -= 19;}
    r = ((r * 11) % 30) + iMonth + iDay;
    if (iMonth<3){r += 2;}
    r -= ((iYear<2000) ? 4 : 8.3);
    r = floor(r+0.5);
最后一个呢

        NSInteger thisJD = [self julday:iYear iMonth:iMonth iDay:iDay];
    float degToRad = 3.14159265 / 180;
    float K0, T, T2, T3, J0, F0, M0, M1, B1, oldJ = 0.0;
    K0 = floor((iYear-1900)*12.3685);
    T = (iYear-1899.5) / 100;
    T2 = T*T; T3 = T*T*T;
    J0 = 2415020 + 29*K0;
    F0 = 0.0001178*T2 - 0.000000155*T3 + (0.75933 + 0.53058868*K0) - (0.000837*T + 0.000335*T2);
    M0 = 360*[self getFrac:((K0*0.08084821133)) + 359.2242 - 0.0000333*T2 - 0.00000347*T3];
    M1 = 360*[self getFrac:((K0*0.07171366128)) + 306.0253 + 0.0107306*T2 + 0.00001236*T3];
    B1 = 360*[self getFrac:((K0*0.08519585128)) + 21.2964 - (0.0016528*T2) - (0.00000239*T3)];
    NSInteger phase = 0;
    NSInteger jday = 0;
    while (jday < thisJD) {
        float F = F0 + 1.530588*phase;
        float M5 = (M0 + phase*29.10535608)*degToRad;
        float M6 = (M1 + phase*385.81691806)*degToRad;
        float B6 = (B1 + phase*390.67050646)*degToRad;
        F -= 0.4068*sin(M6) + (0.1734 - 0.000393*T)*sin(M5);
        F += 0.0161*sin(2*M6) + 0.0104*sin(2*B6);
        F -= 0.0074*sin(M5 - M6) - 0.0051*sin(M5 + M6);
        F += 0.0021*sin(2*M5) + 0.0010*sin(2*B6-M6);
        F += 0.5 / 1440; 
        oldJ=jday;
        jday = J0 + 28*phase + floor(F);
        phase++;
    }
    float jd = fmodf((thisJD-oldJ), 30);
NSInteger thisJD=[self-julday:iYear-iMonth:iMonth-iDay:iDay];
浮点数=3.14159265/180;
浮点数K0,T,T2,T3,J0,F0,M0,M1,B1,oldJ=0.0;
K0=地板((iYear-1900)*12.3685);
T=(iYear-1899.5)/100;
T2=T*T;T3=T*T*T;
J0=2415020+29*K0;
F0=0.0001178*T2-0.000000155*T3+(0.75933+0.53058868*K0)-(0.000837*T+0.000335*T2);
M0=360*[自回归系数:((K0*0.08084821133))+359.2242-0.0000333*T2-0.00000347*T3];
M1=360*[自回归系数:((K0*0.07171366128))+306.0253+0.0107306*T2+0.00001236*T3];
B1=360*[自回归系数:((K0*0.08519585128))+21.2964-(0.0016528*T2)-(0.00000239*T3)];
NSInteger相位=0;
NSInteger jday=0;
while(jday
所有人的工作都越来越少,但没有一个人真正给出了2017年和2018年满月的正确日期

有没有人有一个能正确计算月球相位的函数——也基于时区

编辑:
我只想要月相的函数。SwiftAA提供了更多功能,只会在应用程序中产生不需要的开销。

Oops对不起,标记错误。libNOVA说,这是一种自动现象,讨厌使用合适的库。它甚至有一个月球计算的例子。可能是NASA级精度的重复,你需要CSPICE库:嗨。这里有一位瑞士作家。我能做些什么来缓和你所说的“间接费用”?
        NSInteger thisJD = [self julday:iYear iMonth:iMonth iDay:iDay];
    float degToRad = 3.14159265 / 180;
    float K0, T, T2, T3, J0, F0, M0, M1, B1, oldJ = 0.0;
    K0 = floor((iYear-1900)*12.3685);
    T = (iYear-1899.5) / 100;
    T2 = T*T; T3 = T*T*T;
    J0 = 2415020 + 29*K0;
    F0 = 0.0001178*T2 - 0.000000155*T3 + (0.75933 + 0.53058868*K0) - (0.000837*T + 0.000335*T2);
    M0 = 360*[self getFrac:((K0*0.08084821133)) + 359.2242 - 0.0000333*T2 - 0.00000347*T3];
    M1 = 360*[self getFrac:((K0*0.07171366128)) + 306.0253 + 0.0107306*T2 + 0.00001236*T3];
    B1 = 360*[self getFrac:((K0*0.08519585128)) + 21.2964 - (0.0016528*T2) - (0.00000239*T3)];
    NSInteger phase = 0;
    NSInteger jday = 0;
    while (jday < thisJD) {
        float F = F0 + 1.530588*phase;
        float M5 = (M0 + phase*29.10535608)*degToRad;
        float M6 = (M1 + phase*385.81691806)*degToRad;
        float B6 = (B1 + phase*390.67050646)*degToRad;
        F -= 0.4068*sin(M6) + (0.1734 - 0.000393*T)*sin(M5);
        F += 0.0161*sin(2*M6) + 0.0104*sin(2*B6);
        F -= 0.0074*sin(M5 - M6) - 0.0051*sin(M5 + M6);
        F += 0.0021*sin(2*M5) + 0.0010*sin(2*B6-M6);
        F += 0.5 / 1440; 
        oldJ=jday;
        jday = J0 + 28*phase + floor(F);
        phase++;
    }
    float jd = fmodf((thisJD-oldJ), 30);