]> git.eshelyaron.com Git - emacs.git/commitdiff
Support solar and lunar eclipses in Calendar
authorNicholas Strauss <nicholas.strauss@gmail.com>
Wed, 22 Jan 2020 14:12:58 +0000 (15:12 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 22 Jan 2020 14:12:58 +0000 (15:12 +0100)
* lisp/calendar/lunar.el (eclipse-check): New function to display
solar and lunar eclipses (bug#20414).
(lunar-phase): Use it.
(calendar-lunar-phases): Ditto.

lisp/calendar/lunar.el

index 616d2b0c4ede1d1a9d7aba8faf15abaf1951880e..3d5a0a236b4534b2cad829531921085576887b87 100644 (file)
@@ -91,6 +91,7 @@ remainder mod 4 gives the phase: 0 new moon, 1 first quarter, 2 full moon,
                        (* -0.0016528 time time)
                        (* -0.00000239 time time time))
                     360.0))
+        (eclipse (eclipse-check moon-lat phase))
          (adjustment
           (if (memq phase '(0 2))
               (+ (* (- 0.1734 (* 0.000393 time))
@@ -146,7 +147,26 @@ remainder mod 4 gives the phase: 0 new moon, 1 first quarter, 2 full moon,
          (time (* 24 (- date (truncate date))))
          (date (calendar-gregorian-from-absolute (truncate date)))
          (adj (dst-adjust-time date time)))
-    (list (car adj) (apply 'solar-time-string (cdr adj)) phase)))
+    (list (car adj) (apply 'solar-time-string (cdr adj)) phase eclipse)))
+
+;; from "Astronomy with your Personal Computer", Subroutine Eclipse
+;; Line 7000 Peter Duffett-Smith Cambridge University Press 1990
+(defun eclipse-check (moon-lat phase)
+  (let* ((moon-lat (* (/ float-pi 180) moon-lat))
+         (moon-lat (abs (- moon-lat (* (floor (/ moon-lat float-pi))
+                                       float-pi))))
+         (moon-lat (if (> moon-lat 0.37)
+                       (- float-pi moon-lat)
+                     moon-lat))
+         (phase-name (cond ((= phase 0) "Solar")
+                           ((= phase 2) "Lunar")
+                           (t ""))))
+    (cond ((< moon-lat 2.42600766e-1)
+          (concat "** " phase-name " Eclipse **"))
+         ((< moon-lat 0.37)
+          (concat "** " phase-name " Eclipse possible **"))
+         (t
+          ""))))
 
 (defconst lunar-cycles-per-year 12.3685 ; 365.25/29.530588853
   "Mean number of lunar cycles per 365.25 day year.")
@@ -222,9 +242,10 @@ use instead of point."
         (insert
          (mapconcat
           (lambda (x)
-            (format "%s: %s %s" (calendar-date-string (car x))
+            (format "%s: %s %s %s" (calendar-date-string (car x))
                     (lunar-phase-name (nth 2 x))
-                    (cadr x)))
+                    (cadr x)
+                   (car (last x))))
           (lunar-phase-list m1 y1) "\n")))
       (message "Computing phases of the moon...done"))))