lunarPos 月の黄経、黄緯、および地心距離を計算する
long solarPos(double *lng, double *lat, long j, double d);
lng (出力)黄経(単位、度) lat (出力)黄緯(単位、度) j (入力)世界標準時から換算したユリウス日の整数部分 d (入力)世界標準時から換算したユリウス日の小数部分
地心距離(月・太陽中心間の距離)(単位、キロ・メートル)
long lunarPos(double *lng, double *lat, long j, double d) { typedef struct { double k, a, b; } TBL; static TBL ln[61] = { { 6.2888, 477198.868, 44.963 },{ 1.274, 413335.35, 10.74 }, { 0.6583, 890534.22, 145.7 }, { 0.2136, 954397.74, 179.93 }, { 0.1851, 35999.05, 87.53 }, { 0.1144, 966404.0, 276.5 }, { 0.0588, 63863.5, 124.2 }, { 0.0571, 377336.3, 13.2 }, { 0.0533,1367733.1, 280.7 }, { 0.0458, 854535.2, 148.2 }, { 0.0409, 441199.8, 47.4 }, { 0.0347, 445267.1, 27.9 }, { 0.0304, 513179.9, 222.5 }, { 0.0154, 75870.0, 41.0 }, { 0.0125,1443603.0, 52.0 }, { 0.0110, 489205.0, 142.0 }, { 0.0107,1303870.0, 246.0 }, { 0.0100,1431597.0, 315.0 }, { 0.0085, 826671.0, 111.0 }, { 0.0079, 449334.0, 188.0 }, { 0.0068, 926533.0, 323.0 }, { 0.0052, 31932.0, 107.0 }, { 0.0050, 481266.0, 205.0 }, { 0.0040,1331734.0, 283.0 }, { 0.0040,1844932.0, 56.0 }, { 0.0040, 133.0, 29.0 }, { 0.0038,1781068.0, 21.0 }, { 0.0037, 541062.0, 259.0 }, { 0.0028, 1934.0, 145.0 }, { 0.0027, 918399.0, 182.0 }, { 0.0026,1379739.0, 17.0 }, { 0.0024, 99863.0, 122.0 }, { 0.0023, 922466.0, 163.0 }, { 0.0022, 818536.0, 151.0 }, { 0.0021, 990397.0, 357.0 }, { 0.0021, 71998.0, 85.0 }, { 0.0021, 341337.0, 16.0 }, { 0.0018, 401329.0, 274.0 }, { 0.0016,1856938.0, 152.0 }, { 0.0012,1267871.0, 249.0 }, { 0.0011,1920802.0, 186.0 }, { 0.0009, 858602.0, 129.0 }, { 0.0008,1403732.0, 98.0 }, { 0.0007, 790672.0, 114.0 }, { 0.0007, 405201.0, 50.0 }, { 0.0007, 485333.0, 186.0 }, { 0.0007, 27864.0, 127.0 }, { 0.0006, 111869.0, 38.0 }, { 0.0006,2258267.0, 156.0 }, { 0.0005,1908795.0, 90.0 }, { 0.0005,1745069.0, 24.0 }, { 0.0005, 509131.0, 242.0 }, { 0.0004, 39871.0, 223.0 }, { 0.0004, 12006.0, 187.0 }, { 0.0003, 958465.0, 340.0 }, { 0.0003, 381404.0, 354.0 }, { 0.0003, 349472.0, 337.0 }, { 0.0003,1808933.0, 58.0 }, { 0.0003, 549197.0, 220.0 }, { 0.0003, 4067.0, 70.0 }, { 0.0003,2322131.0, 191.0 }}; static TBL la[45] = { { 5.1281, 483202.019, 3.273}, { 0.2806, 960400.89, 138.24 }, { 0.2777, 6003.15, 48.31 }, { 0.1733, 407332.20, 52.43 }, { 0.0554, 896537.4, 104.0 }, { 0.0463, 69866.7, 82.5 }, { 0.0326,1373736.2, 239.0 }, { 0.0172,1437599.8, 273.2 }, { 0.0093, 884531.0, 187.0 }, { 0.0088, 471196.0, 87.0 }, { 0.0082, 371333.0, 55.0 }, { 0.0043, 547066.0, 217.0 }, { 0.0042,1850935.0, 14.0 }, { 0.0034, 443331.0, 230.0 }, { 0.0025, 860538.0, 106.0 }, { 0.0022, 481268.0, 308.0 }, { 0.0022,1337737.0, 241.0 }, { 0.0021, 105866.0, 80.0 }, { 0.0019, 924402.0, 141.0 }, { 0.0018, 820668.0, 153.0 }, { 0.0018, 519201.0, 181.0 }, { 0.0018,1449606.0, 10.0 }, { 0.0015, 42002.0, 46.0 }, { 0.0015, 928469.0, 121.0 }, { 0.0015, 996400.0, 316.0 }, { 0.0014, 29996.0, 129.0 }, { 0.0013, 447203.0, 6.0 }, { 0.0013, 37935.0, 65.0 }, { 0.0011,1914799.0, 48.0 }, { 0.0010,1297866.0, 288.0 }, { 0.0009,1787072.0, 340.0 }, { 0.0008, 972407.0, 235.0 }, { 0.0007,1309873.0, 205.0 }, { 0.0006, 559072.0, 134.0 }, { 0.0006,1361730.0, 322.0 }, { 0.0005, 848532.0, 190.0 }, { 0.0005, 419339.0, 149.0 }, { 0.0005, 948395.0, 222.0 }, { 0.0004,2328134.0, 149.0 }, { 0.0004,1024264.0, 352.0 }, { 0.0003, 932536.0, 282.0 }, { 0.0003,1409735.0, 57.0 }, { 0.0003,2264270.0, 115.0 }, { 0.0003,1814936.0, 16.0 }, { 0.0003, 335334.0, 57.0 }}; static TBL c[43] = { { 0.051820, 477198.868,134.963}, { 0.009530, 413335.35, 100.74 }, { 0.007842, 890534.22, 235.7 }, { 0.002824, 954397.74, 269.93 }, { 0.000858,1367733.1, 10.7 }, { 0.000531, 854535.2, 238.2 }, { 0.000400, 377336.3, 103.2 }, { 0.000319, 441199.8, 137.4 }, { 0.000271, 445267.0, 118.0 }, { 0.000263, 513198.0, 312.0 }, { 0.000197, 489205.0, 232.0 }, { 0.000173,1431597.0, 45.0 }, { 0.000167,1303870.0, 336.0 }, { 0.000111, 35999.0, 178.0 }, { 0.000103, 826671.0, 201.0 }, { 0.000084, 63864.0, 214.0 }, { 0.000083, 926533.0, 53.0 }, { 0.000078,1844932.0, 146.0 }, { 0.000073,1781068.0, 111.0 }, { 0.000064,1331734.0, 13.0 }, { 0.000063, 449334.0, 278.0 }, { 0.000041, 481266.0, 295.0 }, { 0.000034, 918399.0, 272.0 }, { 0.000033, 541062.0, 349.0 }, { 0.000031, 922466.0, 253.0 }, { 0.000030, 75870.0, 131.0 }, { 0.000029, 990397.0, 87.0 }, { 0.000026, 818536.0, 241.0 }, { 0.000023, 553069.0, 266.0 }, { 0.000019,1267871.0, 339.0 }, { 0.000013,1403732.0, 188.0 }, { 0.000013, 341337.0, 106.0 }, { 0.000013, 401329.0, 4.0 }, { 0.000012,2258267.0, 246.0 }, { 0.000011,1908795.0, 180.0 }, { 0.000011, 858602.0, 219.0 }, { 0.000010,1745069.0, 114.0 }, { 0.000009, 790672.0, 204.0 }, { 0.000007,2322131.0, 281.0 }, { 0.000007,1808933.0, 148.0 }, { 0.000006, 485333.0, 276.0 }, { 0.0000006, 99863.0, 212.0 }, { 0.000005, 405201.0, 140.0 }}; int i; double s, t, r; t = (j + d - 2451545.0)/36525.0; s = 218.3162 + 481267.8809 * t; for (i = 0; i < 61; i++) { r = ln[i].a * t + ln[i].b; s += ln[i].k * cos(r * 0.017453292519943); } while (s < 0) s += 360.0; while (s >= 360.0) s-= 360.0; *lng = s; s = 0.0; for (i = 0; i < 45; i++) { r = la[i].a * t + la[i].b; s += la[i].k * cos(r * 0.017453292519943); } while (s < 0) s += 360.0; while (s >= 360.0) s-= 360.0; *lat = s; s = 0.950725; for (i = 0; i < 43; i++) { r = c[i].a * t + c[i].b; s += c[i].k * cos(r * 0.017453292519943); } return (long)(6378.14 / sin(s * 0.017453292519943)); }
太陽と月の黄経を知ると、新月・満月・上弦・下弦の日時を計算で きる。これらは月の黄経と太陽の黄経の差がそれぞれ0度、180度、90度、 270度になる瞬間だからである。また、新月時に月の黄緯が0に近い値 であれば日食となり、満月時に同様に近い値であれば月食となる。
なお、日本時間JSTを世界標準時UTに直すには、UT = JST - 9 で計算す ればよい。